Archived
Compare commits
1416
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
07e7282614 | ||
|
|
c33d8fc201 | ||
|
|
a0f9f0b03d | ||
|
|
2e2b37e493 | ||
|
|
f9463f64c3 | ||
|
|
f66d199e75 | ||
|
|
c46dac7572 | ||
|
|
c3f2cbcedc | ||
|
|
9cc581dd3d | ||
|
|
c35114b2d3 | ||
|
|
e03aacbcd7 | ||
|
|
f59e482f58 | ||
|
|
6a1e6f6495 | ||
|
|
70a86d195f | ||
|
|
8d5412e643 | ||
|
|
0ff8992874 | ||
|
|
b5b84c2547 | ||
|
|
c2b016b2b9 | ||
|
|
d44531274b | ||
|
|
c52ee36d1b | ||
|
|
9b86927e2c | ||
|
|
e224b80995 | ||
|
|
88f3d9ef1a | ||
|
|
6737029a61 | ||
|
|
d4786564bd | ||
|
|
6fd69d7999 | ||
|
|
4ec75b3d5a | ||
|
|
04e3f1e71f | ||
|
|
df77631299 | ||
|
|
a8d0f05c81 | ||
|
|
c79637be77 | ||
|
|
b5e11da9a8 | ||
|
|
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 | ||
|
|
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 | ||
|
|
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 | ||
|
|
6b95fb7f77 | ||
|
|
da7e193219 | ||
|
|
31f9b48bd7 | ||
|
|
1d6b30edff | ||
|
|
349a76395b | ||
|
|
32b3b98f76 | ||
|
|
010ed6e010 | ||
|
|
a8675f5c49 | ||
|
|
f76ef44dee | ||
|
|
2387a0e39e | ||
|
|
98980fc857 | ||
|
|
6f7d8fe248 | ||
|
|
03a1ccd597 | ||
|
|
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 | ||
|
|
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 | ||
|
|
ce52cbdbed | ||
|
|
752e1e2c42 | ||
|
|
6b617ed4ad | ||
|
|
9b19950945 | ||
|
|
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 | ||
|
|
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 | ||
|
|
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 | ||
|
|
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 | ||
|
|
0e13b98b7f | ||
|
|
56a7544c1e | ||
|
|
61636b6e3d | ||
|
|
ab835e904e | ||
|
|
cd10165510 | ||
|
|
446d26607c | ||
|
|
8d204ce1cd | ||
|
|
2656a67fca | ||
|
|
46c5f74b49 | ||
|
|
a5ece9b453 | ||
|
|
9fb5a9698c | ||
|
|
fad2f19ae4 | ||
|
|
2ad04fc7c1 | ||
|
|
f656ecd23f | ||
|
|
d42aad87bd | ||
|
|
415ee8ef30 | ||
|
|
306065dcbd | ||
|
|
824ba97704 | ||
|
|
ac8ab147bc | ||
|
|
640c99cde2 | ||
|
|
da2492e017 | ||
|
|
f93d235877 | ||
|
|
fe798e3f60 | ||
|
|
b8dcc4e9e0 | ||
|
|
4b6175b6c4 | ||
|
|
388a2faf84 | ||
|
|
0b0bb4d598 | ||
|
|
7696ddd8d2 | ||
|
|
1301a9d082 | ||
|
|
e87affee08 | ||
|
|
b00b21e6b8 | ||
|
|
835851350c | ||
|
|
7bdb48b644 | ||
|
|
84d6f44e9b | ||
|
|
2fd109d967 | ||
|
|
f9934ccf27 | ||
|
|
b93218e165 | ||
|
|
8e55308df9 | ||
|
|
5270739641 | ||
|
|
ce8e8fa706 | ||
|
|
d326a82c4e | ||
|
|
c1683a058c | ||
|
|
aa168bb3a1 | ||
|
|
fe53955bea | ||
|
|
ba3dad1365 | ||
|
|
6d2d259c01 | ||
|
|
92774647ff | ||
|
|
9ca047923f | ||
|
|
c893a2820b | ||
|
|
baa0166fc8 | ||
|
|
58c200aca0 | ||
|
|
b8a4b3541d | ||
|
|
584a1514ac | ||
|
|
21af6ab2c4 | ||
|
|
c606e02673 | ||
|
|
ff4eb296ff | ||
|
|
ea26cdd628 | ||
|
|
26e28bdda8 | ||
|
|
15d1f14ee1 | ||
|
|
22e007b70b | ||
|
|
9e4a538a07 | ||
|
|
c44c771feb | ||
|
|
394bbab320 | ||
|
|
3008081ae8 | ||
|
|
7474c00498 | ||
|
|
964bf925e7 | ||
|
|
fb8129148d | ||
|
|
73db03148a | ||
|
|
6367d3399d | ||
|
|
ee4e7113d2 | ||
|
|
ad86e41345 | ||
|
|
e682b375e7 | ||
|
|
78425a621a | ||
|
|
1030b1c41a | ||
|
|
76bdad6eaf | ||
|
|
ce56dd9e9f | ||
|
|
e7a53ba7b5 | ||
|
|
9f1f6934ee | ||
|
|
773bf3f5e7 | ||
|
|
cdc900d5fd | ||
|
|
80522a3a2f | ||
|
|
0157812357 | ||
|
|
329564d8f6 | ||
|
|
ba2a067c8b | ||
|
|
4d67a656f5 | ||
|
|
ad1d40cdd1 | ||
|
|
131e0eb371 | ||
|
|
e563011099 | ||
|
|
7c072752c8 | ||
|
|
36ced002e0 | ||
|
|
3e1b892eef | ||
|
|
f4004cf2be | ||
|
|
d1d8723186 | ||
|
|
a6fd052a4f | ||
|
|
cede944538 | ||
|
|
3b3c2768d3 | ||
|
|
3dd19c702f | ||
|
|
c028adfb77 | ||
|
|
1d2caa0fe3 | ||
|
|
d7ca1512bd | ||
|
|
ebe435027f | ||
|
|
dfefa6746f | ||
|
|
c90df5c972 | ||
|
|
514a91c2c7 | ||
|
|
ee7d1cb9a2 | ||
|
|
309b320534 | ||
|
|
fdfa7d3387 | ||
|
|
6785bfc3e0 | ||
|
|
c682fb9184 | ||
|
|
ca6ea96eae | ||
|
|
3ebc197fac | ||
|
|
52871efb09 | ||
|
|
f014dc9f93 | ||
|
|
e6cda406c9 | ||
|
|
df04397b13 | ||
|
|
e0b29c905c | ||
|
|
44ae806b30 | ||
|
|
78e3cf74b9 | ||
|
|
428353d379 | ||
|
|
9697e93915 | ||
|
|
e057e463bd | ||
|
|
d494a7c7d6 | ||
|
|
e525227865 | ||
|
|
10bdd27608 | ||
|
|
2790ae74e7 | ||
|
|
31d01c75c5 | ||
|
|
0da8d3d46d | ||
|
|
60761e9f4a | ||
|
|
ec9684b826 | ||
|
|
1073044f31 | ||
|
|
81126974f5 | ||
|
|
06f443a503 | ||
|
|
eb560aaf33 | ||
|
|
464b82bfb9 | ||
|
|
1c75fb6f71 | ||
|
|
5f5d8a9712 | ||
|
|
dc329a0e29 | ||
|
|
15a09e4b05 | ||
|
|
94f973406e | ||
|
|
6404e45d66 | ||
|
|
c0f689331e | ||
|
|
0f5a5251db | ||
|
|
3352bfd805 | ||
|
|
60ed2afaa4 | ||
|
|
9ac534c171 | ||
|
|
cecbdb2ded | ||
|
|
1092d5dcaf | ||
|
|
4af6b2937c | ||
|
|
263fb6c3d4 | ||
|
|
09fa8b4f1f | ||
|
|
214dc3ffa1 | ||
|
|
fad04744cf | ||
|
|
033b74517f | ||
|
|
0b7564e874 | ||
|
|
0d247e6416 | ||
|
|
b92cc7bc09 | ||
|
|
eba18b0235 | ||
|
|
69f8184dfe | ||
|
|
31c1570ffb | ||
|
|
fe2650c4fd | ||
|
|
f89209c555 | ||
|
|
b3d0a6f0c7 | ||
|
|
6bd1726fc9 | ||
|
|
b0ff54d157 | ||
|
|
277dc7051e | ||
|
|
ace4a6b364 | ||
|
|
146514d386 | ||
|
|
1187ee9fd6 | ||
|
|
4527276254 | ||
|
|
6f52302875 | ||
|
|
cbe27c2add | ||
|
|
cd156ab1bc | ||
|
|
f9d0e2aee0 | ||
|
|
253b3d3c90 | ||
|
|
28d4adc571 | ||
|
|
925af1e645 | ||
|
|
4130e0a796 | ||
|
|
01933b1602 | ||
|
|
0482aa7124 | ||
|
|
75015f6d22 | ||
|
|
aa3707aa56 | ||
|
|
ff06b419f2 | ||
|
|
c1c0bd2596 | ||
|
|
978cbdabfc | ||
|
|
e0d585e125 | ||
|
|
cc6229002c | ||
|
|
ca776b0cb5 | ||
|
|
7b29ca28d9 | ||
|
|
0fb71a9227 | ||
|
|
f1bfc9fec0 | ||
|
|
705d811832 | ||
|
|
3ed68efab7 | ||
|
|
454dc26128 | ||
|
|
d56cfa805b | ||
|
|
506b15cd4f | ||
|
|
4a0474546c | ||
|
|
51bb5b3833 | ||
|
|
f4d1a04303 | ||
|
|
44cac3e1ab | ||
|
|
2ea51d94ef | ||
|
|
750a743a50 | ||
|
|
1c8db3ac94 | ||
|
|
b70ec77328 | ||
|
|
baf8767a91 | ||
|
|
62887e8089 | ||
|
|
24eef611d4 | ||
|
|
62d5779c75 | ||
|
|
3493e96aad | ||
|
|
23ff92de6c | ||
|
|
279d7eeca6 | ||
|
|
bb979e4322 | ||
|
|
d57ffe59e7 | ||
|
|
4dfa2cd96c | ||
|
|
7eef50eb7a | ||
|
|
69751540d3 | ||
|
|
ef81b04f4e | ||
|
|
e41c728fb2 | ||
|
|
4e83bc6158 | ||
|
|
c6d7f6b0cb | ||
|
|
3828db341a | ||
|
|
da0534e928 | ||
|
|
be4cbd36d1 | ||
|
|
8e0c424f81 | ||
|
|
e30d95ff09 | ||
|
|
0b32153489 | ||
|
|
3e0cf6d691 | ||
|
|
d34a2069d6 | ||
|
|
9fbc946c68 | ||
|
|
e964fa72f3 | ||
|
|
1532e141b9 | ||
|
|
490cd92707 | ||
|
|
d6c89c7ada | ||
|
|
dd138f1168 | ||
|
|
1b165c3575 | ||
|
|
77478078f6 | ||
|
|
61e6092cb3 | ||
|
|
0d78fa29f3 | ||
|
|
a892cb890b | ||
|
|
8a6b376373 | ||
|
|
80ddf816b0 | ||
|
|
511f1f4731 | ||
|
|
a5a7e1ece1 | ||
|
|
c9d1fba36d | ||
|
|
ad7cc655d1 | ||
|
|
34990e5de2 | ||
|
|
984408cd52 | ||
|
|
3b1b9c0b98 | ||
|
|
7f776cf56b | ||
|
|
8ef248b0a7 | ||
|
|
bf883a779f | ||
|
|
050fda377b | ||
|
|
dad8e061ea | ||
|
|
bc17f80050 | ||
|
|
8db1edb262 | ||
|
|
e279c04e62 | ||
|
|
0da2167591 | ||
|
|
8e0d302fd4 | ||
|
|
9c16681b58 | ||
|
|
d883553934 | ||
|
|
340d07a03f | ||
|
|
4bbc22cbde | ||
|
|
80134e5ad0 | ||
|
|
c777ce75ad | ||
|
|
af12682341 | ||
|
|
28cfc045fb | ||
|
|
9b98f3d91c | ||
|
|
0814a6a877 | ||
|
|
23eb27cf7f | ||
|
|
33b15677d2 | ||
|
|
902c3c629e | ||
|
|
4169d1a26e | ||
|
|
7d3679afd2 | ||
|
|
6921bc7f4a | ||
|
|
0621b32fba | ||
|
|
2388968f2a | ||
|
|
24f41879bf | ||
|
|
d4ee784460 | ||
|
|
2434fbf5ee | ||
|
|
141b5055d7 | ||
|
|
a8f82f800f | ||
|
|
5343a4aa98 | ||
|
|
60c741d935 | ||
|
|
be885ce917 | ||
|
|
da1c9c3fe2 | ||
|
|
a151b73d03 | ||
|
|
47f77c2819 | ||
|
|
841999daba | ||
|
|
8e29e479de | ||
|
|
3094170cc2 | ||
|
|
795e8fdf0e | ||
|
|
007448878b | ||
|
|
ebf362e9a9 | ||
|
|
1c70e3495f | ||
|
|
e75d71d748 | ||
|
|
6916e4650a | ||
|
|
38c8def43a | ||
|
|
9c103a0c40 | ||
|
|
d3b10d46ad | ||
|
|
f8c3a0db98 | ||
|
|
0eaa3065a3 | ||
|
|
f91d727c99 | ||
|
|
fd18d4921b | ||
|
|
16ad7bfb6f | ||
|
|
a3e14a94cc | ||
|
|
2b5bda2a44 | ||
|
|
85143986ee | ||
|
|
ba0a60ba09 | ||
|
|
a1d7f6d4d2 | ||
|
|
c341b3e42f | ||
|
|
3a38c24360 | ||
|
|
abfef73cd1 | ||
|
|
f82125a486 | ||
|
|
1a3bbf26f2 | ||
|
|
616644de6c | ||
|
|
c16b9ef5c9 | ||
|
|
7a27df60c2 | ||
|
|
e8493ef0bd | ||
|
|
dae5411e6a | ||
|
|
755475bff7 | ||
|
|
9c5955bc6f | ||
|
|
17af34ff94 | ||
|
|
92c8b4c1b6 | ||
|
|
aa6cd254c7 | ||
|
|
3baf0b15c7 | ||
|
|
593fa78f13 | ||
|
|
a39578e1a4 | ||
|
|
f5868618b7 | ||
|
|
2920fd82f1 | ||
|
|
ad11de53af | ||
|
|
d7ac9b937a | ||
|
|
3a4b5dbd9b | ||
|
|
6eb1b5af55 | ||
|
|
aa09953b67 | ||
|
|
a8b079b72b | ||
|
|
fcef78dee0 | ||
|
|
fd28af2f6c | ||
|
|
81ed89b240 | ||
|
|
52b4f90b78 | ||
|
|
79f45631a0 | ||
|
|
6060a8b86a | ||
|
|
4814b8fbad | ||
|
|
da97f06db8 | ||
|
|
709e964579 | ||
|
|
3c0bece982 | ||
|
|
1646119b16 | ||
|
|
252ce855c9 | ||
|
|
937dbe9b43 | ||
|
|
6379b64351 | ||
|
|
b83aca7969 | ||
|
|
52170590e3 | ||
|
|
7a1ba95212 | ||
|
|
4eb10aa676 | ||
|
|
1cab239155 | ||
|
|
1bec8c2038 | ||
|
|
9433ef87b2 | ||
|
|
f0b2b1e774 | ||
|
|
123bf2943a | ||
|
|
fd3545523e | ||
|
|
6c828f6c6d | ||
|
|
62234b3f9d | ||
|
|
e53378a76b | ||
|
|
e41b94bb77 | ||
|
|
975efe5958 | ||
|
|
5e8e2388b5 | ||
|
|
eea6bbbcb5 | ||
|
|
05705afdfe | ||
|
|
0ba553cc40 | ||
|
|
0674b0ac7c | ||
|
|
252e920848 | ||
|
|
77e4093d14 | ||
|
|
19a8393a3a | ||
|
|
af1a54ae07 | ||
|
|
63ffdf2519 | ||
|
|
e3714f4cac | ||
|
|
e8537ba916 | ||
|
|
2fca6d1fba | ||
|
|
2199a929eb | ||
|
|
6389331c30 | ||
|
|
3f27662e3f | ||
|
|
313e0c94f7 | ||
|
|
a12b45f8f9 | ||
|
|
587e484cf8 | ||
|
|
e8845a092a | ||
|
|
3dca804acd | ||
|
|
761e987067 | ||
|
|
9277b1fa25 | ||
|
|
9103753b09 | ||
|
|
f99dfc965f | ||
|
|
91fb3ac329 | ||
|
|
36cc8bea7e | ||
|
|
e875ed5a12 | ||
|
|
1a0e0b13e7 | ||
|
|
f71d96be6e | ||
|
|
40429a67ef | ||
|
|
71e7467c17 | ||
|
|
d860d9edd2 | ||
|
|
8decff316b | ||
|
|
f21648386b | ||
|
|
ab99f6722c | ||
|
|
46d0f8c060 | ||
|
|
b46c33d15c | ||
|
|
d3bc921000 | ||
|
|
2c3c8fbff2 | ||
|
|
0bf0941bdc | ||
|
|
c52497af59 | ||
|
|
6ad23d280d | ||
|
|
bf0dc15a00 | ||
|
|
73550b3201 | ||
|
|
e077aa34df | ||
|
|
58f7c99ddc | ||
|
|
50d1d9645a | ||
|
|
41d55110ea | ||
|
|
867fdc3fcc | ||
|
|
64c02614ba | ||
|
|
ac5efdb40f | ||
|
|
4b232cc0e4 | ||
|
|
70fb5b42ec | ||
|
|
719c699981 | ||
|
|
456628d014 | ||
|
|
76a44a8f95 | ||
|
|
f66428d04c | ||
|
|
ee925d07b4 | ||
|
|
9b03b49028 | ||
|
|
15c224ff5d | ||
|
|
7cb129dbc4 | ||
|
|
2059b48abb | ||
|
|
e1ff44ed3c | ||
|
|
709c76a851 | ||
|
|
677608c14d | ||
|
|
fd8025c674 | ||
|
|
560c426bc0 | ||
|
|
e1fef2d7f3 | ||
|
|
f44b079cde | ||
|
|
8e5383b0f2 | ||
|
|
615872992f | ||
|
|
2e0b090fb7 | ||
|
|
5d7fd63adc | ||
|
|
0948bacaaf | ||
|
|
8fd653afbc | ||
|
|
b058cb80b1 | ||
|
|
490ae1868b | ||
|
|
4384fd1387 | ||
|
|
529b1c9bd7 | ||
|
|
fc84548d8a | ||
|
|
e57b8297c0 | ||
|
|
efe38aba62 | ||
|
|
7bd5dada2b | ||
|
|
16db063339 | ||
|
|
5d79dcc7b6 | ||
|
|
deda769e8b | ||
|
|
f31e4154b2 | ||
|
|
7476e4c928 | ||
|
|
d5258b7c79 | ||
|
|
04929a1ca3 | ||
|
|
67e0e5ed5d |
@@ -1,11 +1,11 @@
|
|||||||
# This file is currently used by autoprefixer to adjust CSS to support the below specified browsers
|
# This file is currently used by autoprefixer to adjust CSS to support the below specified browsers
|
||||||
# For additional information regarding the format and rule options, please see:
|
# For additional information regarding the format and rule options, please see:
|
||||||
# https://github.com/browserslist/browserslist#queries
|
# https://github.com/browserslist/browserslist#queries
|
||||||
#
|
#
|
||||||
# For IE 9-11 support, please remove 'not' from the last line of the file and adjust as needed
|
# For IE 9-11 support, please remove 'not' from the last line of the file and adjust as needed
|
||||||
|
|
||||||
> 0.5%
|
> 0.5%
|
||||||
last 2 versions
|
last 2 versions
|
||||||
Firefox ESR
|
Firefox ESR
|
||||||
not dead
|
not dead
|
||||||
not IE 9-11
|
not IE 9-11
|
||||||
@@ -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": {
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -22,6 +22,7 @@ speed-measure-plugin.json
|
|||||||
*.launch
|
*.launch
|
||||||
.settings/
|
.settings/
|
||||||
*.sublime-workspace
|
*.sublime-workspace
|
||||||
|
.vs/*
|
||||||
|
|
||||||
# IDE - VSCode
|
# IDE - VSCode
|
||||||
.vscode/*
|
.vscode/*
|
||||||
@@ -32,6 +33,7 @@ speed-measure-plugin.json
|
|||||||
.history/*
|
.history/*
|
||||||
|
|
||||||
# misc
|
# misc
|
||||||
|
/.angular/cache
|
||||||
/.sass-cache
|
/.sass-cache
|
||||||
/connect.lock
|
/connect.lock
|
||||||
/coverage
|
/coverage
|
||||||
@@ -46,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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+12
-35
@@ -1,47 +1,24 @@
|
|||||||
|
@Library('farmmaps-shared-library') _
|
||||||
|
|
||||||
pipeline {
|
pipeline {
|
||||||
agent any
|
agent any;
|
||||||
environment {
|
options {
|
||||||
PACKAGE_VERSION_PREFIX=sh(script: 'jq .version package.json |sed "s/\\"//g"', returnStdout: true).trim()
|
copyArtifactPermission projectNames: env.allProjectsArtifactPermission;
|
||||||
PACKAGE_VERSION="${PACKAGE_VERSION_PREFIX + '-prerelease.' + env.BUILD_NUMBER}"
|
disableConcurrentBuilds();
|
||||||
}
|
}
|
||||||
stages {
|
stages {
|
||||||
stage('npm install'){
|
stage('FarmmapsLibBuildAll') {
|
||||||
steps {
|
steps {
|
||||||
sh '''npm install
|
stepFarmmapsLibBuildAll();
|
||||||
cd projects/common
|
|
||||||
npm install
|
|
||||||
cd ../common-map
|
|
||||||
npm install
|
|
||||||
'''
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage('build'){
|
|
||||||
steps {
|
|
||||||
sh '''ng build common
|
|
||||||
ng build common-map'''
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage('npm publish'){
|
|
||||||
steps {
|
|
||||||
sh '''cd dist/common
|
|
||||||
npm version ${PACKAGE_VERSION}
|
|
||||||
npm publish
|
|
||||||
cd ../common-map
|
|
||||||
npm version ${PACKAGE_VERSION}
|
|
||||||
npm publish'''
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
post {
|
post {
|
||||||
|
success {
|
||||||
|
postSuccess();
|
||||||
|
}
|
||||||
always {
|
always {
|
||||||
emailext (
|
postAlways();
|
||||||
body: '${DEFAULT_CONTENT}',
|
|
||||||
mimeType: 'text/html',
|
|
||||||
replyTo: '${DEFAULT_REPLYTO}',
|
|
||||||
subject: '${DEFAULT_SUBJECT}',
|
|
||||||
to: emailextrecipients([[$class: 'CulpritsRecipientProvider'], [$class: 'RequesterRecipientProvider']])
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
This is a sample FarmMaps client in Angular 7.x.
|
This is a sample FarmMaps client in Angular 7.x.
|
||||||
|
|
||||||
|
|
||||||
## Quick start
|
## Quick start
|
||||||
|
|
||||||
Use one of the two options below to get started.
|
Use one of the two options below to get started.
|
||||||
@@ -16,8 +15,8 @@ Use one of the two options below to get started.
|
|||||||
*Setup*
|
*Setup*
|
||||||
|
|
||||||
```
|
```
|
||||||
docker pull node:10.16.0
|
docker pull node:12.13.1
|
||||||
docker run -t -i --entrypoint /bin/bash -p 4200:4200 node:10.16.0
|
docker run -t -i --entrypoint /bin/bash -p 4200:4200 node:12.13.1
|
||||||
```
|
```
|
||||||
|
|
||||||
Inside the running container
|
Inside the running container
|
||||||
@@ -51,9 +50,15 @@ npm install -g @angular/cli
|
|||||||
npm install
|
npm install
|
||||||
ng serve
|
ng serve
|
||||||
```
|
```
|
||||||
*Go*
|
*Go*`
|
||||||
|
|
||||||
Point your browser to http://localhost:4200
|
Point your browser to http://localhost:4200
|
||||||
|
|
||||||
|
*ESLint*
|
||||||
|
|
||||||
|
```
|
||||||
|
npm run lint src
|
||||||
|
npm run lint projects/common/src
|
||||||
|
npm run lint projects/common-map/src
|
||||||
|
npm run lint projects/common-map3d/src
|
||||||
|
```
|
||||||
+160
-59
@@ -11,8 +11,12 @@
|
|||||||
"schematics": {},
|
"schematics": {},
|
||||||
"architect": {
|
"architect": {
|
||||||
"build": {
|
"build": {
|
||||||
"builder": "@angular-devkit/build-angular:browser",
|
"builder": "@angular-builders/custom-webpack:browser",
|
||||||
"options": {
|
"options": {
|
||||||
|
"customWebpackConfig": {
|
||||||
|
"path": "./custom-webpack.config.js"
|
||||||
|
},
|
||||||
|
"aot": true,
|
||||||
"outputPath": "dist/farmmaps-lib-app",
|
"outputPath": "dist/farmmaps-lib-app",
|
||||||
"index": "src/index.html",
|
"index": "src/index.html",
|
||||||
"main": "src/main.ts",
|
"main": "src/main.ts",
|
||||||
@@ -21,29 +25,35 @@
|
|||||||
"assets": [
|
"assets": [
|
||||||
{
|
{
|
||||||
"glob": "**/*",
|
"glob": "**/*",
|
||||||
"input":"src/assets/images",
|
"input": "src/assets/images",
|
||||||
"output":"/images"
|
"output": "/images"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"glob": "silent-refresh.html",
|
"glob": "silent-refresh.html",
|
||||||
"input":"src/assets",
|
"input": "src/assets",
|
||||||
"output":"/"
|
"output": "/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"glob": "favicon.ico",
|
"glob": "favicon.ico",
|
||||||
"input":"src/assets",
|
"input": "src/assets",
|
||||||
"output":"/"
|
"output": "/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"glob": "**/*",
|
||||||
|
"input": "node_modules/cesium/Build/Cesium",
|
||||||
|
"output": "/assets/cesium"
|
||||||
},
|
},
|
||||||
"src/configuration.json"
|
"src/configuration.json"
|
||||||
],
|
],
|
||||||
"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/ol/ol.css"
|
||||||
],
|
],
|
||||||
"scripts": [],
|
"scripts": []
|
||||||
"es5BrowserSupport": true
|
|
||||||
},
|
},
|
||||||
"configurations": {
|
"configurations": {
|
||||||
"production": {
|
"production": {
|
||||||
@@ -66,27 +76,60 @@
|
|||||||
{
|
{
|
||||||
"type": "initial",
|
"type": "initial",
|
||||||
"maximumWarning": "2mb",
|
"maximumWarning": "2mb",
|
||||||
"maximumError": "5mb"
|
"maximumError": "7mb"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "anyComponentStyle",
|
||||||
|
"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"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"serve": {
|
"serve": {
|
||||||
"builder": "@angular-devkit/build-angular:dev-server",
|
"builder": "@angular-builders/custom-webpack:dev-server",
|
||||||
"options": {
|
"options": {
|
||||||
"browserTarget": "farmmaps-lib-app:build"
|
"browserTarget": "farmmaps-lib-app:build"
|
||||||
},
|
},
|
||||||
"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": {
|
||||||
@@ -105,18 +148,6 @@
|
|||||||
"src/assets"
|
"src/assets"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"lint": {
|
|
||||||
"builder": "@angular-devkit/build-angular:tslint",
|
|
||||||
"options": {
|
|
||||||
"tsConfig": [
|
|
||||||
"src/tsconfig.app.json",
|
|
||||||
"src/tsconfig.spec.json"
|
|
||||||
],
|
|
||||||
"exclude": [
|
|
||||||
"**/node_modules/**"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -136,15 +167,6 @@
|
|||||||
"devServerTarget": "farmmaps-lib-app:serve:production"
|
"devServerTarget": "farmmaps-lib-app:serve:production"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"lint": {
|
|
||||||
"builder": "@angular-devkit/build-angular:tslint",
|
|
||||||
"options": {
|
|
||||||
"tsConfig": "e2e/tsconfig.e2e.json",
|
|
||||||
"exclude": [
|
|
||||||
"**/node_modules/**"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -155,12 +177,17 @@
|
|||||||
"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"
|
||||||
}
|
}
|
||||||
},
|
, "configurations": {
|
||||||
|
"production": {
|
||||||
|
"tsConfig": "projects/common/tsconfig.lib.prod.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"test": {
|
"test": {
|
||||||
"builder": "@angular-devkit/build-angular:karma",
|
"builder": "@angular-devkit/build-angular:karma",
|
||||||
"options": {
|
"options": {
|
||||||
@@ -168,18 +195,6 @@
|
|||||||
"tsConfig": "projects/common/tsconfig.spec.json",
|
"tsConfig": "projects/common/tsconfig.spec.json",
|
||||||
"karmaConfig": "projects/common/karma.conf.js"
|
"karmaConfig": "projects/common/karma.conf.js"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"lint": {
|
|
||||||
"builder": "@angular-devkit/build-angular:tslint",
|
|
||||||
"options": {
|
|
||||||
"tsConfig": [
|
|
||||||
"projects/common/tsconfig.lib.json",
|
|
||||||
"projects/common/tsconfig.spec.json"
|
|
||||||
],
|
|
||||||
"exclude": [
|
|
||||||
"**/node_modules/**"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -190,10 +205,15 @@
|
|||||||
"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": {
|
||||||
|
"production": {
|
||||||
|
"tsConfig": "projects/common-map/tsconfig.lib.prod.json"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"test": {
|
"test": {
|
||||||
@@ -203,21 +223,102 @@
|
|||||||
"tsConfig": "projects/common-map/tsconfig.spec.json",
|
"tsConfig": "projects/common-map/tsconfig.spec.json",
|
||||||
"karmaConfig": "projects/common-map/karma.conf.js"
|
"karmaConfig": "projects/common-map/karma.conf.js"
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"common-map3d": {
|
||||||
|
"projectType": "library",
|
||||||
|
"root": "projects/common-map3d",
|
||||||
|
"sourceRoot": "projects/common-map3d/src",
|
||||||
|
"prefix": "fm-map3d",
|
||||||
|
"architect": {
|
||||||
|
"build": {
|
||||||
|
"builder": "@angular-devkit/build-angular:ng-packagr:build",
|
||||||
|
"options": {
|
||||||
|
"tsConfig": "projects/common-map3d/tsconfig.lib.json",
|
||||||
|
"project": "projects/common-map3d/ng-package.json"
|
||||||
|
},
|
||||||
|
"configurations": {
|
||||||
|
"production": {
|
||||||
|
"tsConfig": "projects/common-map3d/tsconfig.lib.prod.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"test": {
|
||||||
|
"builder": "@angular-devkit/build-angular:karma",
|
||||||
|
"options": {
|
||||||
|
"main": "projects/common-map3d/src/test.ts",
|
||||||
|
"tsConfig": "projects/common-map3d/tsconfig.spec.json",
|
||||||
|
"karmaConfig": "projects/common-map3d/karma.conf.js"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ng-openlayers": {
|
||||||
|
"projectType": "library",
|
||||||
|
"root": "projects/ng-openlayers",
|
||||||
|
"sourceRoot": "projects/ng-openlayers/src",
|
||||||
|
"prefix": "ng-openlayers",
|
||||||
|
"architect": {
|
||||||
|
"build": {
|
||||||
|
"builder": "@angular-devkit/build-angular:ng-packagr",
|
||||||
|
"options": {
|
||||||
|
"tsConfig": "projects/ng-openlayers/tsconfig.lib.json",
|
||||||
|
"project": "projects/ng-openlayers/ng-package.json"
|
||||||
|
},
|
||||||
|
"configurations": {
|
||||||
|
"production": {
|
||||||
|
"tsConfig": "projects/ng-openlayers/tsconfig.lib.prod.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"test": {
|
||||||
|
"builder": "@angular-devkit/build-angular:karma",
|
||||||
|
"options": {
|
||||||
|
"main": "projects/ng-openlayers/src/test.ts",
|
||||||
|
"tsConfig": "projects/ng-openlayers/tsconfig.spec.json",
|
||||||
|
"karmaConfig": "projects/ng-openlayers/karma.conf.js"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"lint": {
|
"lint": {
|
||||||
"builder": "@angular-devkit/build-angular:tslint",
|
"builder": "@angular-eslint/builder:lint",
|
||||||
"options": {
|
"options": {
|
||||||
"tsConfig": [
|
"lintFilePatterns": [
|
||||||
"projects/common-map/tsconfig.lib.json",
|
"projects/ng-openlayers/**/*.ts",
|
||||||
"projects/common-map/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": "."
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
module.exports = {
|
||||||
|
resolve: {
|
||||||
|
fallback: {
|
||||||
|
// Resolve node module use of fs
|
||||||
|
fs: "empty",
|
||||||
|
Buffer: false,
|
||||||
|
http: require.resolve("stream-http"),
|
||||||
|
https: require.resolve("https-browserify"),
|
||||||
|
url: require.resolve("url/"),
|
||||||
|
zlib: require.resolve('browserify-zlib'),
|
||||||
|
assert: require.resolve("assert/"),
|
||||||
|
util: require.resolve("util/"),
|
||||||
|
buffer: require.resolve("buffer/")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -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 */
|
||||||
|
|||||||
@@ -0,0 +1,224 @@
|
|||||||
|
PS DFarmmapsFarmMapsLib ng update @angularcore@19 @angularcli@19
|
||||||
|
The installed Angular CLI version is outdated.
|
||||||
|
Installing a temporary Angular CLI versioned 19.2.19 to perform the update.
|
||||||
|
Using package manager npm
|
||||||
|
Collecting installed dependencies...
|
||||||
|
Found 68 dependencies.
|
||||||
|
Fetching dependency metadata from registry...
|
||||||
|
Updating package.json with dependency @angular-devkitbuild-angular @ 19.2.19 (was 18.2.3)...
|
||||||
|
Updating package.json with dependency @angularcli @ 19.2.19 (was 18.2.3)...
|
||||||
|
Updating package.json with dependency @angularcompiler-cli @ 19.2.18 (was 18.2.3)...
|
||||||
|
Updating package.json with dependency @angularlanguage-service @ 19.2.18 (was 18.2.3)...
|
||||||
|
Updating package.json with dependency @angularlocalize @ 19.2.18 (was 18.2.3)...
|
||||||
|
Updating package.json with dependency ng-packagr @ 19.2.2 (was 18.2.1)...
|
||||||
|
Updating package.json with dependency typescript @ 5.8.3 (was 5.4.4)...
|
||||||
|
Updating package.json with dependency @angularanimations @ 19.2.18 (was 18.2.3)...
|
||||||
|
Updating package.json with dependency @angularcommon @ 19.2.18 (was 18.2.3)...
|
||||||
|
Updating package.json with dependency @angularcompiler @ 19.2.18 (was 18.2.3)...
|
||||||
|
Updating package.json with dependency @angularcore @ 19.2.18 (was 18.2.3)...
|
||||||
|
Updating package.json with dependency @angularforms @ 19.2.18 (was 18.2.3)...
|
||||||
|
Updating package.json with dependency @angularplatform-browser @ 19.2.18 (was 18.2.3)...
|
||||||
|
Updating package.json with dependency @angularplatform-browser-dynamic @ 19.2.18 (was 18.2.3)...
|
||||||
|
Updating package.json with dependency @angularrouter @ 19.2.18 (was 18.2.3)...
|
||||||
|
Updating package.json with dependency zone.js @ 0.15.1 (was 0.14.10)...
|
||||||
|
UPDATE package.json (2923 bytes)
|
||||||
|
✔ Cleaning node modules directory
|
||||||
|
✔ Installing packages
|
||||||
|
Executing migrations of package '@angularcli'
|
||||||
|
|
||||||
|
❯ Update '@angularssr' import paths to use the new 'node' entry point when 'CommonEngine' is detected.
|
||||||
|
Migration completed (No changes made).
|
||||||
|
|
||||||
|
❯ Update the workspace configuration by replacing deprecated options in 'angular.json' for compatibility with the latest Angular CLI changes.
|
||||||
|
UPDATE angular.json (9341 bytes)
|
||||||
|
Migration completed (1 file modified).
|
||||||
|
|
||||||
|
Optional migrations of package '@angularcli'
|
||||||
|
|
||||||
|
This package has 1 optional migration that can be executed.
|
||||||
|
Optional migrations may be skipped and executed after the update process, if preferred.
|
||||||
|
|
||||||
|
Select the migrations that you'd like to run [use-application-builder] Migrate application projects to the new build system.
|
||||||
|
(httpsangular.devtoolsclibuild-system-migration)
|
||||||
|
|
||||||
|
❯ Migrate application projects to the new build system.
|
||||||
|
Application projects that are using the '@angular-devkitbuild-angular' package's 'browser' andor 'browser-esbuild' builders will be migrated to use the new 'application' builder.
|
||||||
|
You can read more about this, including known issues and limitations, here httpsangular.devtoolsclibuild-system-migration
|
||||||
|
Cannot update project farmmaps-lib-app to use the application builder. Only @angular-devkitbuild-angularbrowser-esbuild and @angular-devkitbuild-angularbrowser can be automatically migrated.
|
||||||
|
UPDATE tsconfig.json (902 bytes)
|
||||||
|
Migration completed (1 file modified).
|
||||||
|
|
||||||
|
Executing migrations of package '@angularcore'
|
||||||
|
|
||||||
|
❯ Updates non-standalone Directives, Component and Pipes to 'standalonefalse' and removes 'standalonetrue' from those who are standalone.
|
||||||
|
UPDATE srcappapp.component.ts (374 bytes)
|
||||||
|
UPDATE srcapplogologo.component.ts (349 bytes)
|
||||||
|
UPDATE srcappmenumenu.component.ts (750 bytes)
|
||||||
|
UPDATE srcappregisterdeviceregisterdevice.component.ts (334 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentsauth-callbackauth-callback.component.ts (731 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentssession-clearedsession-cleared.component.ts (755 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentsnot-foundnot-found.component.ts (315 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentsapp-menuapp-menu.component.ts (870 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentsappapp.component.ts (8994 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentsavataravatar.component.ts (1240 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentsback-buttonback-button.component.ts (712 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentsedit-image-modaledit-image-modal.component.ts (2388 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentsgradient-selectgradient-select.component.ts (1714 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentsgradientgradient.component.ts (1423 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentshas-claimhas-claim.directive.ts (1217 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentshas-packagehas-package.directive.ts (1889 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentshas-rolehas-role.directive.ts (1216 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentshelp-menuhelp-menu.component.ts (908 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentssetting-menusetting-menu.component.ts (958 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentsitem-linkitem-link.component.ts (1304 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentsmenu-backgroundmenu-background.component.ts (800 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentsnot-implementednot-implemented.component.ts (280 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentsnotification-menunotification-menu.component.ts (941 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentspackage-existspackage-exists.directive.ts (1898 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentsresumable-file-uploadresumable-file-upload.component.ts (1774 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentsside-panelside-panel.component.ts (2839 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentstag-inputtag-input.component.ts (2990 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentsthumbnailthumbnail.component.ts (2968 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentstimespantimespan.component.ts (22797 bytes)
|
||||||
|
UPDATE projectscommonsrcfmcomponentsuser-menuuser-menu.component.ts (1174 bytes)
|
||||||
|
UPDATE projectscommonsrcfmsharedsafe.pipe.ts (352 bytes)
|
||||||
|
UPDATE srcapptesttest.component.ts (784 bytes)
|
||||||
|
UPDATE srcapplandingpagelandingpage.component.ts (482 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsaolfile-drop-targetfile-drop-target.component.ts (2615 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsmapmap.component.ts (22343 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsaolgps-locationgps-location.component.ts (2719 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsaolitem-layersitem-layers.component.ts (20542 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsaolitem-vector-sourceitem-vector-source.component.ts (9990 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsaollayer-listlayer-list.component.ts (2070 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsaollayer-valueslayer-values.component.ts (2528 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsaollayer-vector-imagelayer-vector-image.component.ts (882 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsaolpan-to-locationpan-to-location.component.ts (2836 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsaolrotation-resetrotation-reset.component.ts (1054 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsaolzoom-to-extentzoom-to-extent.component.ts (2064 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsfeature-listfeature-list.component.ts (2505 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentswidget-hostwidget-host.directive.ts (236 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsfeature-list-containerfeature-list-container.component.ts (4111 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsfeature-list-cropfieldfeature-list-cropfield.component.ts (1336 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsfeature-list-observationfeature-list-observation.component.ts (1346 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsfeature-list-croppingschemefeature-list-croppingscheme.component.ts (1497 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsfeature-list-featurefeature-list-feature.component.ts (1090 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsfeature-list-feature-containerfeature-list-feature-container.component.ts (2433 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsfeature-list-feature-cropfieldfeature-list-feature-cropfield.component.ts (1389 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsfeature-list-feature-croppingschemefeature-list-feature-croppingscheme.component.ts (1026 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsfeature-thumbnailfeature-thumbnail.component.ts (2709 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsif-zoom-to-showif-zoom-to-show.directive.ts (1853 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsitem-list-itemitem-list-item.component.ts (1476 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsitem-list-item-containeritem-list-item-container.component.ts (2644 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsitem-listitem-list.component.ts (1373 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsitem-widget-listitem-widget-list.component.ts (1963 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentslayer-switcherlayer-switcher.component.ts (3132 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentslegendhistogram-detailshistogram-details.component.ts (784 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentslegendlegend.component.ts (2698 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentslegendstatistics-detailsstatistics-details.component.ts (848 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsmap-searchmap-search.component.ts (7783 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsmeta-data-modalmeta-data-modal.component.ts (2038 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsselect-period-modalselect-period-modal.component.ts (3542 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsselected-itemselected-item.component.ts (3209 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsselected-item-containerselected-item-container.component.ts (3273 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsselected-item-cropfieldselected-item-cropfield.component.ts (2748 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsselected-item-geotiffselected-item-geotiff.component.ts (2102 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsselected-item-shapeselected-item-shape.component.ts (2125 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentsselected-item-temporalselected-item-temporal.component.ts (3034 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentswidget-statuswidget-status.component.ts (516 bytes)
|
||||||
|
UPDATE projectscommon-mapsrcfm-mapcomponentszoom-to-show-alertzoom-to-show-alert.component.ts (570 bytes)
|
||||||
|
UPDATE projectscommon-map3dsrcfm-map3dcomponentsolcsswitch2d3dswitch2d3d.component.ts (2652 bytes)
|
||||||
|
UPDATE srcappadminadmin.component.ts (211 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibmap.component.ts (5228 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrcliblayerslayergroup.component.ts (734 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrcliblayerslayervector.component.ts (1117 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibsourcesvector.component.ts (1032 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibfeature.component.ts (914 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibview.component.ts (3777 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibgraticule.component.ts (1428 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrcliblayerslayerimage.component.ts (986 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrcliblayerslayertile.component.ts (920 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrcliblayerslayervectortile.component.ts (1334 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibtilegrid.component.ts (976 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibsourcesxyz.component.ts (2744 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibsourcesosm.component.ts (1908 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibsourcesbingmaps.component.ts (1184 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibsourcescluster.component.ts (1444 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibtilegridwmts.component.ts (714 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibsourcestilewmts.component.ts (3079 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibsourcesvectortile.component.ts (1842 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibsourcestilewms.component.ts (1518 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibsourcestilejson.component.ts (775 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibsourcesgeojson.component.ts (1095 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibsourcesimagestatic.component.ts (2471 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibsourcesimagewms.component.ts (2109 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibsourcesimagearcgisrest.component.ts (2059 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibsourcesraster.component.ts (1768 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibgeomgeometrycircle.component.ts (905 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibgeomgeometrylinestring.component.ts (765 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibgeomgeometrymultilinestring.component.ts (816 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibgeomgeometrymultipoint.component.ts (765 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibgeomgeometrymultipolygon.component.ts (841 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibgeomgeometrypoint.component.ts (706 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibgeomgeometrypolygon.component.ts (784 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibcontent.component.ts (248 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrcliboverlay.component.ts (1218 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibcoordinate.component.ts (2457 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibcollectioncoordinates.component.ts (3392 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibstylesstyle.component.ts (1421 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibstylescircle.component.ts (1621 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibstylestext.component.ts (2204 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibstylesstroke.component.ts (2972 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibstylesicon.component.ts (2091 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibstylesfill.component.ts (2201 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibcontrolsdefault.component.ts (1189 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibcontrolscontrol.component.ts (914 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibcontrolsattribution.component.ts (898 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibcontrolsfullscreen.component.ts (880 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibcontrolsmouseposition.component.ts (1033 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibcontrolsoverviewmap.component.ts (1292 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibcontrolsrotate.component.ts (853 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibcontrolsscaleline.component.ts (680 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibcontrolszoom.component.ts (916 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibcontrolszoomslider.component.ts (862 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibcontrolszoomtoextent.component.ts (911 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibformatsmvt.component.ts (667 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibinteractionsdefault.component.ts (1075 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibinteractionsdoubleclickzoom.component.ts (689 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibinteractionsdraganddrop.component.ts (824 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibinteractionsdragbox.component.ts (805 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibinteractionsdragpan.component.ts (739 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibinteractionsdragrotate.component.ts (720 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibinteractionsdragrotateandzoom.component.ts (755 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibinteractionsdragzoom.component.ts (769 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibinteractionsmousewheelzoom.component.ts (719 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibinteractionspinchzoom.component.ts (674 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibinteractionsdraw.component.ts (2579 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibinteractionskeyboardpan.component.ts (674 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibinteractionskeyboardzoom.component.ts (673 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibinteractionsselect.component.ts (2121 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibinteractionsmodify.component.ts (2173 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibinteractionstranslate.component.ts (2062 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibattribution.component.ts (379 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibattributions.component.ts (869 bytes)
|
||||||
|
UPDATE projectsng-openlayerssrclibsourcesutfgrid.component.ts (841 bytes)
|
||||||
|
Migration completed (150 files modified).
|
||||||
|
|
||||||
|
❯ Updates ExperimentalPendingTasks to PendingTasks.
|
||||||
|
Migration completed (No changes made).
|
||||||
|
|
||||||
|
❯ Adds `BootstrapContext` to `bootstrapApplication` calls in `main.server.ts` to support server rendering.
|
||||||
|
Migration completed (No changes made).
|
||||||
|
|
||||||
|
Optional migrations of package '@angularcore'
|
||||||
|
|
||||||
|
This package has 1 optional migration that can be executed.
|
||||||
|
Optional migrations may be skipped and executed after the update process, if preferred.
|
||||||
|
|
||||||
|
Select the migrations that you'd like to run [provide-initializer] Replaces `APP_INITIALIZER`, `ENVIRONMENT_INITIALIZER` & `PLATFORM_INITIALIZER` respectively with
|
||||||
|
`provideAppInitializer`, `provideEnvironmentInitializer` & `providePlatformInitializer`.
|
||||||
|
|
||||||
|
❯ Replaces `APP_INITIALIZER`, `ENVIRONMENT_INITIALIZER` & `PLATFORM_INITIALIZER` respectively with `provideAppInitializer`, `provideEnvironmentInitializer` & `providePlatformInitializer`.
|
||||||
|
UPDATE projectscommonsrcfmcommon-service.module.ts (3960 bytes)
|
||||||
|
Migration completed (1 file modified).
|
||||||
|
|
||||||
|
PS DFarmmapsFarmMapsLib
|
||||||
Generated
+19903
-10478
File diff suppressed because it is too large
Load Diff
+85
-46
@@ -1,63 +1,102 @@
|
|||||||
{
|
{
|
||||||
"name": "farmmaps-lib-app",
|
"name": "farmmaps-lib-app",
|
||||||
"version": "0.0.1",
|
"version": "4.19.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"ng": "ng",
|
"ng": "ng",
|
||||||
"start": "ng serve",
|
"start": "ng serve",
|
||||||
"build": "ng build",
|
"build": "ng build",
|
||||||
"test": "ng test",
|
"test": "ng test",
|
||||||
"lint": "ng lint",
|
"lint": "eslint -c .eslintrc.js --ext .ts",
|
||||||
"e2e": "ng e2e"
|
"e2e": "ng e2e"
|
||||||
},
|
},
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@angular/animations": "~7.2.0",
|
"@angular-eslint/eslint-plugin": "21.1.0",
|
||||||
"@angular/common": "~7.2.0",
|
"@angular/animations": "21.1.0",
|
||||||
"@angular/compiler": "~7.2.0",
|
"@angular/common": "21.1.0",
|
||||||
"@angular/core": "~7.2.0",
|
"@angular/compiler": "21.1.0",
|
||||||
"@angular/forms": "~7.2.0",
|
"@angular/core": "21.1.0",
|
||||||
"@angular/platform-browser": "~7.2.0",
|
"@angular/forms": "21.1.0",
|
||||||
"@angular/platform-browser-dynamic": "~7.2.0",
|
"@angular/platform-browser": "21.1.0",
|
||||||
"@angular/router": "~7.2.0",
|
"@angular/platform-browser-dynamic": "21.1.0",
|
||||||
"@aspnet/signalr": "^1.1.4",
|
"@angular/router": "21.1.0",
|
||||||
"@farmmaps/common": ">=0.0.1-prerelease.69 <0.0.1",
|
"@farmmaps/common": "file:dist/common",
|
||||||
"@farmmaps/common-map": ">=0.0.1-prerelease.69 <0.0.1",
|
"@farmmaps/common-map": "file:dist/common-map",
|
||||||
"@ng-bootstrap/ng-bootstrap": "^4.2.1",
|
"@farmmaps/common-map3d": "file:dist/common-map3d",
|
||||||
"@ngrx/effects": "^7.2.0",
|
"@farmmaps/ng-openlayers": "file:dist/ng-openlayers",
|
||||||
"@ngrx/router-store": "^7.2.0",
|
"@microsoft/signalr": "10.0.0",
|
||||||
"@ngrx/store": "^7.2.0",
|
"@ng-bootstrap/ng-bootstrap": "^20.0.0",
|
||||||
"bootstrap": "^4.3.1",
|
"@ngrx/effects": "21.0.1",
|
||||||
"font-awesome": "^4.7.0",
|
"@ngrx/router-store": "21.0.1",
|
||||||
"core-js": "^2.5.4",
|
"@ngrx/store": "21.0.1",
|
||||||
"ngrx-store-localstorage": "^8.0.0",
|
"@popperjs/core": "^2.11.8",
|
||||||
|
"angular-oauth2-oidc": "20.0.2",
|
||||||
|
"assert": "^2.0.0",
|
||||||
|
"bootstrap": "5.3.8",
|
||||||
|
"browserify-zlib": "^0.2.0",
|
||||||
|
"buffer": "^6.0.3",
|
||||||
|
"cesium": "^1.97.0",
|
||||||
|
"core-js": "^2.6.12",
|
||||||
|
"https-browserify": "^1.0.0",
|
||||||
|
"moment": "^2.29.4",
|
||||||
|
"ngrx-store-localstorage": "20.1.0",
|
||||||
|
"ngx-avatars": "1.10.1",
|
||||||
|
"ngx-clipboard": "^16.0.0",
|
||||||
|
"ngx-image-cropper": "9.1.6",
|
||||||
|
"ngx-uploadx": "7.0.1",
|
||||||
|
"ol": "^8.2.0",
|
||||||
|
"olcs": "^2.13.1",
|
||||||
"resumablejs": "^1.1.0",
|
"resumablejs": "^1.1.0",
|
||||||
"rxjs": "~6.3.3",
|
"rxjs": "7.8.1",
|
||||||
|
"stream": "^0.0.2",
|
||||||
|
"stream-http": "^3.2.0",
|
||||||
"tassign": "^1.0.0",
|
"tassign": "^1.0.0",
|
||||||
"zone.js": "~0.8.26"
|
"tslib": "^2.4.0",
|
||||||
|
"url": "^0.11.0",
|
||||||
|
"util": "^0.12.4",
|
||||||
|
"zone.js": "~0.15.1"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@lmdb/lmdb-linux-x64": "^3.1.0",
|
||||||
|
"@rollup/rollup-linux-x64-gnu": "^4.21.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@angular-devkit/build-angular": "~0.13.0",
|
"@angular-builders/custom-webpack": "^21.0.3",
|
||||||
"@angular-devkit/build-ng-packagr": "~0.13.0",
|
"@angular-devkit/build-angular": "21.1.0",
|
||||||
"@angular/cli": "~7.3.8",
|
"@angular/cli": "21.1.0",
|
||||||
"@angular/compiler-cli": "~7.2.0",
|
"@angular/compiler-cli": "21.1.0",
|
||||||
"@angular/language-service": "~7.2.0",
|
"@angular/language-service": "21.1.0",
|
||||||
"@types/node": "~8.9.4",
|
"@angular/localize": "21.1.0",
|
||||||
|
"@types/arcgis-rest-api": "^10.4.5",
|
||||||
"@types/jasmine": "~2.8.8",
|
"@types/jasmine": "~2.8.8",
|
||||||
"@types/jasminewd2": "~2.0.3",
|
"@types/jasminewd2": "^2.0.9",
|
||||||
"codelyzer": "~4.5.0",
|
"@types/node": "^22.5.4",
|
||||||
"jasmine-core": "~2.99.1",
|
"@typescript-eslint/eslint-plugin": "^6.18.0",
|
||||||
"jasmine-spec-reporter": "~4.2.1",
|
"@typescript-eslint/eslint-plugin-tslint": "^6.18.0",
|
||||||
"karma": "~4.0.0",
|
"@typescript-eslint/parser": "^6.18.0",
|
||||||
"karma-chrome-launcher": "~2.2.0",
|
"codelyzer": "^6.0.2",
|
||||||
"karma-coverage-istanbul-reporter": "~2.0.1",
|
"eslint": "^8.35.0",
|
||||||
"karma-jasmine": "~1.1.2",
|
"eslint-config-prettier": "^8.6.0",
|
||||||
"karma-jasmine-html-reporter": "^0.2.2",
|
"eslint-plugin-import": "^2.27.5",
|
||||||
"ng-packagr": "^4.2.0",
|
"jasmine-core": "^4.3.0",
|
||||||
"protractor": "~5.4.0",
|
"jasmine-spec-reporter": "^7.0.0",
|
||||||
"ts-node": "~7.0.0",
|
"karma": "^6.3.20",
|
||||||
"tsickle": ">=0.34.0",
|
"karma-chrome-launcher": "~3.1.0",
|
||||||
"tslib": "^1.9.0",
|
"karma-coverage-istanbul-reporter": "^3.0.3",
|
||||||
"tslint": "~5.11.0",
|
"karma-jasmine": "^5.1.0",
|
||||||
"typescript": "~3.2.2"
|
"karma-jasmine-html-reporter": "^2.0.0",
|
||||||
|
"ng-packagr": "^21.1.0",
|
||||||
|
"protractor": "~7.0.0",
|
||||||
|
"ts-node": "^8.8.1",
|
||||||
|
"typescript": "~5.9.3"
|
||||||
|
},
|
||||||
|
"overrides": {
|
||||||
|
"ngx-avatars": {
|
||||||
|
"@angular/common": "$@angular/common",
|
||||||
|
"@angular/core": "$@angular/core"
|
||||||
|
},
|
||||||
|
"ngx-uploadx": {
|
||||||
|
"@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
+265
-86
@@ -1,108 +1,287 @@
|
|||||||
{
|
{
|
||||||
"name": "@farmmaps/common-map",
|
"name": "@farmmaps/common-map",
|
||||||
"version": "0.0.1",
|
"version": "2.0.0",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"packages": {
|
||||||
"@farmmaps/common": {
|
"": {
|
||||||
"version": "0.0.1-prerelease.56",
|
"name": "@farmmaps/common-map",
|
||||||
"resolved": "https://repository.akkerweb.nl/repository/npm-group/@farmmaps/common/-/common-0.0.1-prerelease.56.tgz",
|
"version": "2.0.0",
|
||||||
"integrity": "sha512-m9KxWsLkTSz2JI074gIJH1kDR0PCLsFAug8oBjtlU/QxgBySrvqHCRiODpNmNWnFyNTZHqKHJQefn3Q9iAil4g==",
|
"dependencies": {
|
||||||
"requires": {
|
"tslib": "^2.0.0"
|
||||||
"angular-oauth2-oidc": "^5.0.2",
|
},
|
||||||
"ngx-uploadx": "^3.1.3",
|
"peerDependencies": {
|
||||||
"tslib": "^1.9.0"
|
"@angular/core": "21.1.0",
|
||||||
|
"@farmmaps/common": "file:../../dist/common",
|
||||||
|
"@farmmaps/ng-openlayers": "file:../../dist/ng-openlayers",
|
||||||
|
"@ngrx/effects": "21.0.1",
|
||||||
|
"@ngrx/router-store": "21.0.1",
|
||||||
|
"@ngrx/store": "21.0.1",
|
||||||
|
"ngrx-store-localstorage": "20.1.0",
|
||||||
|
"rxjs": "7.8.1",
|
||||||
|
"tassign": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"angular-oauth2-oidc": {
|
"../../../../dist/common": {
|
||||||
"version": "5.0.2",
|
"extraneous": true
|
||||||
"resolved": "https://registry.npmjs.org/angular-oauth2-oidc/-/angular-oauth2-oidc-5.0.2.tgz",
|
},
|
||||||
"integrity": "sha512-jtOv4IWEjSFfBHVE4seWGWT/ZfWJ95QJ1JaFhVVGJEF64ibGuPwV3ztwTOUl98QHi/Yg4PXXDAisb31JnIbxBw==",
|
"../../../../dist/ng-openlayers": {
|
||||||
"requires": {
|
"extraneous": true
|
||||||
"jsrsasign": "^8.0.12",
|
},
|
||||||
"tslib": "^1.9.0"
|
"../../../dist/ng-openlayers": {
|
||||||
|
"extraneous": true
|
||||||
|
},
|
||||||
|
"../../dist/common": {
|
||||||
|
"name": "@farmmaps/common",
|
||||||
|
"version": "21.1.0",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.3.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/common": "21.1.0",
|
||||||
|
"@angular/core": "21.1.0",
|
||||||
|
"@angular/forms": "21.1.0",
|
||||||
|
"@microsoft/signalr": "10.0.0",
|
||||||
|
"@ng-bootstrap/ng-bootstrap": "^20.0.0",
|
||||||
|
"@ngrx/effects": "21.0.1",
|
||||||
|
"@ngrx/router-store": "21.0.1",
|
||||||
|
"@ngrx/store": "21.0.1",
|
||||||
|
"angular-oauth2-oidc": "20.0.2",
|
||||||
|
"bootstrap": "^5.3.3",
|
||||||
|
"moment": "^2.29.4",
|
||||||
|
"ngx-avatars": "1.10.1",
|
||||||
|
"ngx-clipboard": "^16.0.0",
|
||||||
|
"ngx-image-cropper": "9.1.6",
|
||||||
|
"ngx-uploadx": "7.0.1",
|
||||||
|
"tassign": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ieee754": {
|
"../../dist/libs/ng-openlayers": {
|
||||||
"version": "1.1.13",
|
"version": "18.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
|
"extraneous": true,
|
||||||
"integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
|
"license": "MPL-2.0",
|
||||||
},
|
"dependencies": {
|
||||||
"jsrsasign": {
|
"tslib": "^2.3.0"
|
||||||
"version": "8.0.12",
|
},
|
||||||
"resolved": "https://registry.npmjs.org/jsrsasign/-/jsrsasign-8.0.12.tgz",
|
"peerDependencies": {
|
||||||
"integrity": "sha1-Iqu5ZW00owuVMENnIINeicLlwxY="
|
"@angular/common": "^18.2.3",
|
||||||
},
|
"@angular/core": "^18.2.3",
|
||||||
"ngx-openlayers": {
|
"ol": "^8.2.0"
|
||||||
"version": "1.0.0-next.9",
|
|
||||||
"resolved": "https://registry.npmjs.org/ngx-openlayers/-/ngx-openlayers-1.0.0-next.9.tgz",
|
|
||||||
"integrity": "sha512-14UFxJX9oeOXtq+HJCJyXn0sBmYmCqj2AnFtetKk1FsDe8EUMFGIRju8UOFegCr2oEu5JsuRjALcfW7lCe+teg==",
|
|
||||||
"requires": {
|
|
||||||
"tslib": "^1.9.0"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ngx-uploadx": {
|
"../../dist/ng-openlayers": {
|
||||||
"version": "3.3.2",
|
"name": "@farmmaps/ng-openlayers",
|
||||||
"resolved": "https://registry.npmjs.org/ngx-uploadx/-/ngx-uploadx-3.3.2.tgz",
|
"version": "20.0.1",
|
||||||
"integrity": "sha512-gRdXXq2cRU9HE6dj65qay9GV8NRC7n8y5LtMzJWqsfu2k3CHMQxo2TqZwA9/l/PqJ76RoO7sTPy1OenFQ+krkQ==",
|
"peer": true,
|
||||||
"requires": {
|
"dependencies": {
|
||||||
"tslib": "^1.9.0"
|
"tslib": "^2.3.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/common": ">=19.0.0 <=20.x.x",
|
||||||
|
"@angular/core": ">=19.0.0 <=20.x.x",
|
||||||
|
"ol": "~10.7.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ol": {
|
"../ng-openlayers": {
|
||||||
"version": "5.3.3",
|
"name": "@farmmaps/ng-openlayers",
|
||||||
"resolved": "https://registry.npmjs.org/ol/-/ol-5.3.3.tgz",
|
"version": "20.0.1",
|
||||||
"integrity": "sha512-7eU4x8YMduNcED1D5wI+AMWDRe7/1HmGfsbV+kFFROI9RNABU/6n4osj6Q3trZbxxKnK2DSRIjIRGwRHT/Z+Ww==",
|
"extraneous": true,
|
||||||
"requires": {
|
"peerDependencies": {
|
||||||
"pbf": "3.1.0",
|
"@angular/common": ">=19.0.0 <=20.x.x",
|
||||||
"pixelworks": "1.1.0",
|
"@angular/core": ">=19.0.0 <=20.x.x",
|
||||||
"rbush": "2.0.2"
|
"ol": "~10.7.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"pbf": {
|
"dist/common": {
|
||||||
"version": "3.1.0",
|
"extraneous": true
|
||||||
"resolved": "https://registry.npmjs.org/pbf/-/pbf-3.1.0.tgz",
|
},
|
||||||
"integrity": "sha512-/hYJmIsTmh7fMkHAWWXJ5b8IKLWdjdlAFb3IHkRBn1XUhIYBChVGfVwmHEAV3UfXTxsP/AKfYTXTS/dCPxJd5w==",
|
"dist/ng-openlayers": {
|
||||||
"requires": {
|
"extraneous": true
|
||||||
"ieee754": "^1.1.6",
|
},
|
||||||
"resolve-protobuf-schema": "^2.0.0"
|
"node_modules/@angular/common": {
|
||||||
|
"version": "21.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@angular/common/-/common-21.1.0.tgz",
|
||||||
|
"integrity": "sha512-hL3Chp51TU9iBcIfkNtoBS1wuseP1gsyDW2IFtK5HUpAVhbso9B3fdCaDTFkU98A2unluo2YgzI6D/6IS6N+1g==",
|
||||||
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.3.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/core": "21.1.0",
|
||||||
|
"rxjs": "^6.5.3 || ^7.4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"pixelworks": {
|
"node_modules/@angular/core": {
|
||||||
"version": "1.1.0",
|
"version": "21.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/pixelworks/-/pixelworks-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@angular/core/-/core-21.1.0.tgz",
|
||||||
"integrity": "sha1-Hwla1I3Ki/ihyCWOAJIDGkTyLKU="
|
"integrity": "sha512-QTl9s8GYNN0pt1k3GE6UVlfe6zWtfdykhfchinKq2YJywQ6LBM4UcZgoc56YkgscmyrRFYrr4JYUJjlzTF57+A==",
|
||||||
},
|
"license": "MIT",
|
||||||
"protocol-buffers-schema": {
|
"peer": true,
|
||||||
"version": "3.3.2",
|
"dependencies": {
|
||||||
"resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.3.2.tgz",
|
"tslib": "^2.3.0"
|
||||||
"integrity": "sha512-Xdayp8sB/mU+sUV4G7ws8xtYMGdQnxbeIfLjyO9TZZRJdztBGhlmbI5x1qcY4TG5hBkIKGnc28i7nXxaugu88w=="
|
},
|
||||||
},
|
"engines": {
|
||||||
"quickselect": {
|
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
|
||||||
"version": "1.1.1",
|
},
|
||||||
"resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.1.1.tgz",
|
"peerDependencies": {
|
||||||
"integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ=="
|
"@angular/compiler": "21.1.0",
|
||||||
},
|
"rxjs": "^6.5.3 || ^7.4.0",
|
||||||
"rbush": {
|
"zone.js": "~0.15.0 || ~0.16.0"
|
||||||
"version": "2.0.2",
|
},
|
||||||
"resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.2.tgz",
|
"peerDependenciesMeta": {
|
||||||
"integrity": "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==",
|
"@angular/compiler": {
|
||||||
"requires": {
|
"optional": true
|
||||||
"quickselect": "^1.0.1"
|
},
|
||||||
|
"zone.js": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resolve-protobuf-schema": {
|
"node_modules/@angular/platform-browser": {
|
||||||
"version": "2.1.0",
|
"version": "21.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.1.0.tgz",
|
||||||
"integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==",
|
"integrity": "sha512-Drkal25x+OuRQosAE/cL4uM5WDmgFehanCpsjQ1jGp6Rxoad6Q5Do1uQAE3qgMKHL1aqCPZ+uWzcVVG+Bn1ddg==",
|
||||||
"requires": {
|
"license": "MIT",
|
||||||
"protocol-buffers-schema": "^3.3.1"
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.3.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/animations": "21.1.0",
|
||||||
|
"@angular/common": "21.1.0",
|
||||||
|
"@angular/core": "21.1.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@angular/animations": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tslib": {
|
"node_modules/@angular/router": {
|
||||||
"version": "1.10.0",
|
"version": "21.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
|
"resolved": "https://registry.npmjs.org/@angular/router/-/router-21.1.0.tgz",
|
||||||
"integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
|
"integrity": "sha512-Sneu0ePuH+bf8ZslRX3iQk1iLziindLskdTeHV1ZCrXdT0ZScsZyI/gjxQKBtsIU9692D2DnFQRLGnzTBYVGVw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.3.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/common": "21.1.0",
|
||||||
|
"@angular/core": "21.1.0",
|
||||||
|
"@angular/platform-browser": "21.1.0",
|
||||||
|
"rxjs": "^6.5.3 || ^7.4.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@farmmaps/common": {
|
||||||
|
"resolved": "../../dist/common",
|
||||||
|
"link": true
|
||||||
|
},
|
||||||
|
"node_modules/@farmmaps/ng-openlayers": {
|
||||||
|
"resolved": "../../dist/ng-openlayers",
|
||||||
|
"link": true
|
||||||
|
},
|
||||||
|
"node_modules/@ngrx/effects": {
|
||||||
|
"version": "21.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-21.0.1.tgz",
|
||||||
|
"integrity": "sha512-hSdpToAiSYa5FJ/CAygQHpnCaF2S1HO7q/57ob3XvNTWmkofa0VqI/IIe4W57bojh2YOWCJ91SCn3kAjymaV3g==",
|
||||||
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/core": "^21.0.0",
|
||||||
|
"@ngrx/store": "21.0.1",
|
||||||
|
"rxjs": "^6.5.3 || ^7.5.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@ngrx/router-store": {
|
||||||
|
"version": "21.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@ngrx/router-store/-/router-store-21.0.1.tgz",
|
||||||
|
"integrity": "sha512-hacH8ciwCRMLg7p7bThslYn564GOyS5LPf9c8cX4FTyOH+iJM32eJd2Lt64cA62vN6ruofV/IM2vB09nCkxHzg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/common": "^21.0.0",
|
||||||
|
"@angular/core": "^21.0.0",
|
||||||
|
"@angular/router": "^21.0.0",
|
||||||
|
"@ngrx/store": "21.0.1",
|
||||||
|
"rxjs": "^6.5.3 || ^7.5.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@ngrx/store": {
|
||||||
|
"version": "21.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@ngrx/store/-/store-21.0.1.tgz",
|
||||||
|
"integrity": "sha512-2hGnw/c5o8nmKzyx7TrUUM7FXjE2zqjX0EF+wLbw9Oy/L+VdCmx+ZI1BFjuAR4B8PKEWHG2KSbOM13SMNkpZiA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/core": "^21.0.0",
|
||||||
|
"rxjs": "^6.5.3 || ^7.5.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/deepmerge": {
|
||||||
|
"version": "4.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
|
||||||
|
"integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
|
||||||
|
"peer": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.10.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/ngrx-store-localstorage": {
|
||||||
|
"version": "20.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/ngrx-store-localstorage/-/ngrx-store-localstorage-20.1.0.tgz",
|
||||||
|
"integrity": "sha512-/5+i5qTxZdE8Q5qdSmj7+9JvriAnHwW7RsXzh1rrQ/UHA9vf12q6mJ6wYTTehUO4Qcl2t/K5MRkooN2eG2ZEvw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"deepmerge": "^4.2.2",
|
||||||
|
"tslib": "^2.3.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/common": ">=20.0.0",
|
||||||
|
"@angular/core": ">=20.0.0",
|
||||||
|
"@ngrx/store": ">=20.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/rxjs": {
|
||||||
|
"version": "7.8.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
|
||||||
|
"integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/tassign": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/tassign/-/tassign-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-k0Ti9f+A1R0BRdArEbiUHldd+A40kZ5qsiNSNk4czx61wkAoSZYjqkaQs0jC63AfgPdCXVPstDq2ZW5ZLRTCgw==",
|
||||||
|
"peer": true
|
||||||
|
},
|
||||||
|
"node_modules/tslib": {
|
||||||
|
"version": "2.7.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz",
|
||||||
|
"integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA=="
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,21 @@
|
|||||||
{
|
{
|
||||||
"name": "@farmmaps/common-map",
|
"name": "@farmmaps/common-map",
|
||||||
"version": "0.0.1",
|
"version": "2.0.0",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"registry": "https://repository.akkerweb.nl/repository/npm-hosted/"
|
"registry": "https://repository.akkerweb.nl/repository/npm-hosted/"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ngx-openlayers": "1.0.0-next.9",
|
"tslib": "^2.0.0"
|
||||||
"ol": "^5.3.3"
|
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@angular/core": "^7.2.0",
|
"@angular/core": "21.1.0",
|
||||||
"ngrx-store-localstorage": "^8.0.0",
|
"@farmmaps/common": "file:../../dist/common",
|
||||||
"@ngrx/effects": "^7.2",
|
"@farmmaps/ng-openlayers": "file:../../dist/ng-openlayers",
|
||||||
"@ngrx/router-store": "^7.2",
|
"ngrx-store-localstorage": "20.1.0",
|
||||||
"@ngrx/store": "^7.2",
|
"@ngrx/effects": "21.0.1",
|
||||||
|
"@ngrx/router-store": "21.0.1",
|
||||||
|
"@ngrx/store": "21.0.1",
|
||||||
"tassign": "^1.0.0",
|
"tassign": "^1.0.0",
|
||||||
"@farmmaps/common": ">=0.0.1-prerelease.56 <0.0.1"
|
"rxjs": "7.8.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
//$theme-colors: ( "primary": #a7ce39, "secondary": #ffc800 );
|
|
||||||
//$theme-colors: ( "primary": #a7ce39);
|
|
||||||
@@ -1,241 +1,413 @@
|
|||||||
import { Action } from '@ngrx/store';
|
import { Action } from '@ngrx/store';
|
||||||
|
|
||||||
import { IMapState,IItemLayer,IQueryState } from '../models';
|
import { IMapState } from '../models/map.state';
|
||||||
import { IItem } from '@farmmaps/common';
|
import { IItemLayer } from '../models/item.layer';
|
||||||
import { Feature } from 'ol';
|
import { ILayervalue } from '../models/layer.value';
|
||||||
import { Extent } from 'ol/extent';
|
import { IQueryState } from '@farmmaps/common';
|
||||||
|
import { IItem } from '@farmmaps/common';
|
||||||
export const SETSTATE = '[Map] SetState';
|
import { Feature } from 'ol';
|
||||||
export const SETMAPSTATE = '[Map] MapState';
|
import { Style } from 'ol/style';
|
||||||
export const SETVIEWEXTENT = '[Map] SetViewExtent';
|
import { Geometry } from 'ol/geom';
|
||||||
export const INIT = '[Map] Init';
|
import { IPeriodState } from '../models/period.state';
|
||||||
export const SETPARENT = '[Map] SetParent';
|
|
||||||
export const STARTSEARCH = '[Map] StartSearch';
|
export const SETSTATE = '[Map] SetState';
|
||||||
export const STARTSEARCHSUCCESS = '[Map] StartSearchSuccess';
|
export const SETMAPSTATE = '[Map] MapState';
|
||||||
export const SELECTFEATURE = '[Map] SelectFeature';
|
export const SETVIEWEXTENT = '[Map] SetViewExtent';
|
||||||
export const SELECTITEM = '[Map] SelectItem';
|
export const INIT = '[Map] Init';
|
||||||
export const SELECTITEMSUCCESS = '[Map] SelectItemSuccess';
|
export const SETPARENT = '[Map] SetParent';
|
||||||
export const ADDFEATURESUCCESS = '[Map] AddFeatureSuccess';
|
export const SETPERIOD = '[Map] SetPeriod';
|
||||||
export const UPDATEFEATURESUCCESS = '[Map] UpdateFeatureSuccess';
|
export const STARTSEARCH = '[Map] StartSearch';
|
||||||
export const EXPANDSEARCH = '[Map] ExpandSearch';
|
export const STARTSEARCHSUCCESS = '[Map] StartSearchSuccess';
|
||||||
export const COLLAPSESEARCH = '[Map] CollapseSearch';
|
export const CLICKFEATURE = '[Map] ClickFeature';
|
||||||
export const TOGGLEMENU = '[Map] ToggleMenu';
|
export const SELECTFEATURE = '[Map] SelectFeature';
|
||||||
export const SETEXTENT = '[Map] SetExtent';
|
export const SELECTITEM = '[Map] SelectItem';
|
||||||
export const SETQUERYSTATE = '[Map] SetQueryState';
|
export const SELECTITEMSUCCESS = '[Map] SelectItemSuccess';
|
||||||
export const SETTIMESPAN = '[Map] SetTimeSpan';
|
export const SETSELECTEDITEMLAYER = '[Map] SetSelectedItemLayer';
|
||||||
export const ADDLAYER = '[Map] AddLayer';
|
export const SELECTTEMPORALITEMSSUCCESS = '[Map] SelectTemporalItemsSuccess';
|
||||||
export const SETVISIBILITY = '[Map] SetVisibility';
|
export const NEXTTEMPORAL = '[Map] NextTemporal';
|
||||||
export const SETOPACITY = '[Map] SetOpacity';
|
export const PREVIOUSTEMPORAL = '[Map] PreviousTemporal';
|
||||||
export const SETLAYERINDEX = '[Map] SetLayerIndex';
|
export const SELECTTEMPORAL = '[Map] SelectTemporal';
|
||||||
export const REMOVELAYER = '[Map] RemoveLayer';
|
export const ADDFEATURESUCCESS = '[Map] AddFeatureSuccess';
|
||||||
export const LOADBASELAYERS = '[Map] LoadLayers';
|
export const UPDATEFEATURESUCCESS = '[Map] UpdateFeatureSuccess';
|
||||||
export const LOADBASELAYERSSUCCESS = '[Map] LoadLayersSuccess';
|
export const EXPANDSEARCH = '[Map] ExpandSearch';
|
||||||
export const SELECTBASELAYER = '[Map] SelectBaseLayers';
|
export const COLLAPSESEARCH = '[Map] CollapseSearch';
|
||||||
export const SELECTOVERLAYLAYER = '[Map] SelectOverlayLayers';
|
export const SETEXTENT = '[Map] SetExtent';
|
||||||
export const ZOOMTOEXTENT = '[Map] ZoomToExtent';
|
export const SETQUERYSTATE = '[Map] SetQueryState';
|
||||||
export const DOQUERY = '[Map] DoQuery';
|
export const SETTIMESPAN = '[Map] SetTimeSpan';
|
||||||
|
export const ADDLAYER = '[Map] AddLayer';
|
||||||
export class SetState implements Action {
|
export const SETVISIBILITY = '[Map] SetVisibility';
|
||||||
readonly type = SETSTATE;
|
export const SETOPACITY = '[Map] SetOpacity';
|
||||||
|
export const SETLAYERINDEX = '[Map] SetLayerIndex';
|
||||||
constructor(public mapState: IMapState,public queryState:IQueryState) { }
|
export const REMOVELAYER = '[Map] RemoveLayer';
|
||||||
}
|
export const CLEARLAYERS = '[Map] ClearLayers';
|
||||||
|
export const LOADBASELAYERS = '[Map] LoadLayers';
|
||||||
export class SetMapState implements Action {
|
export const LOADBASELAYERSSUCCESS = '[Map] LoadLayersSuccess';
|
||||||
readonly type = SETMAPSTATE;
|
export const SELECTBASELAYER = '[Map] SelectBaseLayers';
|
||||||
|
export const SELECTOVERLAYLAYER = '[Map] SelectOverlayLayers';
|
||||||
constructor(public mapState: IMapState) { }
|
export const ZOOMTOEXTENT = '[Map] ZoomToExtent';
|
||||||
}
|
export const DOQUERY = '[Map] DoQuery';
|
||||||
|
export const SETSTYLE = '[Map] SetStyle';
|
||||||
export class SetViewExtent implements Action {
|
export const SHOWLAYERSWITCHER = '[Map] ShowLayerSwitcher';
|
||||||
readonly type = SETVIEWEXTENT;
|
export const CLEAR = '[Map] Clear';
|
||||||
|
export const SETREPLACEURL = '[Map] SetReplaceUrl';
|
||||||
constructor(public extent:number[]) { }
|
export const SETFEATURES = '[Map] SetFeatures'
|
||||||
}
|
export const SETLAYERVALUESLOCATION = '[Map] SetLayerValuesLocation'
|
||||||
|
export const TOGGLELAYERVALUESENABLED = '[Map] ToggleLayerValuesEnabled'
|
||||||
export class Init implements Action {
|
export const GETLAYERVALUE = '[Map] GetLayerValue'
|
||||||
readonly type = INIT;
|
export const GETLAYERVALUESUCCESS = '[Map] GetLayerValueSuccess'
|
||||||
|
export const TOGGLESHOWDATALAYERSLIDE = '[Map] ToggleShowDataLayerSlide'
|
||||||
constructor() { }
|
export const SETVIEWSTATE = '[Map] SetViewState'
|
||||||
}
|
export const CLEARFEATURES = '[Map] ClearFeatures';
|
||||||
|
export const SETPANELEXTRAWIDE = '[Map] SetPanelExtraWide';
|
||||||
export class SetParent implements Action {
|
export const BACKUPFEATURES = '[Map] BackupFeatures';
|
||||||
readonly type = SETPARENT;
|
export const RESTOREFEATURES = '[Map] RestoreFeatures';
|
||||||
|
|
||||||
constructor(public parentCode:string) { }
|
export class Clear implements Action {
|
||||||
}
|
readonly type = CLEAR;
|
||||||
|
constructor() {}
|
||||||
export class StartSearch implements Action {
|
}
|
||||||
readonly type = STARTSEARCH;
|
|
||||||
|
export class SetState implements Action {
|
||||||
constructor(public queryState: IQueryState) { }
|
readonly type = SETSTATE;
|
||||||
}
|
|
||||||
|
constructor(public mapState: IMapState,public queryState:IQueryState) { }
|
||||||
export class StartSearchSuccess implements Action {
|
}
|
||||||
readonly type = STARTSEARCHSUCCESS;
|
|
||||||
|
export class SetMapState implements Action {
|
||||||
constructor(public features: Array<Feature>, public query:IQueryState) { }
|
readonly type = SETMAPSTATE;
|
||||||
}
|
|
||||||
|
constructor(public mapState: IMapState) { }
|
||||||
export class SelectFeature implements Action {
|
}
|
||||||
readonly type = SELECTFEATURE;
|
|
||||||
|
export class SetViewExtent implements Action {
|
||||||
constructor(public feature:Feature) { }
|
readonly type = SETVIEWEXTENT;
|
||||||
}
|
|
||||||
|
constructor(public extent:number[]) { }
|
||||||
export class SelectItem implements Action {
|
}
|
||||||
readonly type = SELECTITEM;
|
|
||||||
|
export class Init implements Action {
|
||||||
constructor(public itemCode:string) { }
|
readonly type = INIT;
|
||||||
}
|
|
||||||
|
constructor() { }
|
||||||
export class SelectItemSuccess implements Action {
|
}
|
||||||
readonly type = SELECTITEMSUCCESS;
|
|
||||||
|
export class SetParent implements Action {
|
||||||
constructor(public item: IItem) { }
|
readonly type = SETPARENT;
|
||||||
}
|
|
||||||
|
constructor(public parentCode:string) { }
|
||||||
export class AddFeatureSuccess implements Action {
|
}
|
||||||
readonly type = ADDFEATURESUCCESS;
|
|
||||||
|
export class SetPeriod implements Action {
|
||||||
constructor(public feature: Feature) { }
|
readonly type = SETPERIOD;
|
||||||
}
|
|
||||||
|
constructor(public period:IPeriodState) { }
|
||||||
export class UpdateFeatureSuccess implements Action {
|
}
|
||||||
readonly type = UPDATEFEATURESUCCESS;
|
|
||||||
|
export class StartSearch implements Action {
|
||||||
constructor(public feature: Feature) { }
|
readonly type = STARTSEARCH;
|
||||||
}
|
|
||||||
|
constructor(public queryState: IQueryState) { }
|
||||||
export class ExpandSearch implements Action {
|
}
|
||||||
readonly type = EXPANDSEARCH;
|
|
||||||
|
export class StartSearchSuccess implements Action {
|
||||||
constructor() { }
|
readonly type = STARTSEARCHSUCCESS;
|
||||||
}
|
|
||||||
|
constructor(public features: Array<Feature<Geometry>>, public query:IQueryState) { }
|
||||||
export class CollapseSearch implements Action {
|
}
|
||||||
readonly type = COLLAPSESEARCH;
|
|
||||||
|
export class ClickFeature implements Action {
|
||||||
constructor() { }
|
readonly type = CLICKFEATURE;
|
||||||
}
|
|
||||||
|
constructor(public feature:Feature<Geometry>) { }
|
||||||
export class ToggleMenu implements Action {
|
}
|
||||||
readonly type = TOGGLEMENU;
|
|
||||||
|
export class SelectFeature implements Action {
|
||||||
constructor() { }
|
readonly type = SELECTFEATURE;
|
||||||
}
|
|
||||||
|
constructor(public feature:Feature<Geometry>) { }
|
||||||
export class SetExtent implements Action {
|
}
|
||||||
readonly type = SETEXTENT;
|
|
||||||
|
export class SelectItem implements Action {
|
||||||
constructor(public extent:number[]) { }
|
readonly type = SELECTITEM;
|
||||||
}
|
|
||||||
|
constructor(public itemCode:string) { }
|
||||||
export class SetQueryState implements Action {
|
}
|
||||||
readonly type = SETQUERYSTATE;
|
|
||||||
|
export class SelectItemSuccess implements Action {
|
||||||
constructor(public queryState: IQueryState) { }
|
readonly type = SELECTITEMSUCCESS;
|
||||||
}
|
|
||||||
|
constructor(public item: IItem, public parentItem: IItem) { }
|
||||||
export class SetTimeSpan implements Action {
|
}
|
||||||
readonly type = SETTIMESPAN;
|
|
||||||
|
export class SelectTemporalItemsSuccess implements Action {
|
||||||
constructor(public startDate: Date, public endDate: Date) { }
|
readonly type = SELECTTEMPORALITEMSSUCCESS;
|
||||||
}
|
|
||||||
|
constructor(public temporalItems: IItem[]) { }
|
||||||
export class AddLayer implements Action {
|
}
|
||||||
readonly type = ADDLAYER;
|
|
||||||
|
export class NextTemporal implements Action {
|
||||||
constructor(public item:IItem,public layerIndex=-1) { }
|
readonly type = NEXTTEMPORAL;
|
||||||
}
|
|
||||||
|
constructor() { }
|
||||||
export class SetVisibility implements Action {
|
}
|
||||||
readonly type = SETVISIBILITY;
|
|
||||||
|
export class PreviousTemporal implements Action {
|
||||||
constructor(public itemLayer:IItemLayer,public visibility:boolean) { }
|
readonly type = PREVIOUSTEMPORAL;
|
||||||
}
|
|
||||||
|
constructor() { }
|
||||||
export class SetOpacity implements Action {
|
}
|
||||||
readonly type = SETOPACITY;
|
|
||||||
|
export class SelectTemporal implements Action {
|
||||||
constructor(public itemLayer: IItemLayer, public opacity: number) { }
|
readonly type = SELECTTEMPORAL;
|
||||||
}
|
|
||||||
|
constructor(item:IItem) { }
|
||||||
export class SetLayerIndex implements Action {
|
}
|
||||||
readonly type = SETLAYERINDEX;
|
|
||||||
|
export class AddFeatureSuccess implements Action {
|
||||||
constructor(public layerIndex: number, public itemLayer: IItemLayer = null) { }
|
readonly type = ADDFEATURESUCCESS;
|
||||||
}
|
|
||||||
|
constructor(public feature: Feature<Geometry>) { }
|
||||||
export class RemoveLayer implements Action {
|
}
|
||||||
readonly type = REMOVELAYER;
|
|
||||||
|
export class UpdateFeatureSuccess implements Action {
|
||||||
constructor(public itemLayer: IItemLayer) { }
|
readonly type = UPDATEFEATURESUCCESS;
|
||||||
}
|
|
||||||
|
constructor(public feature: Feature<Geometry>) { }
|
||||||
export class LoadBaseLayers implements Action {
|
}
|
||||||
readonly type = LOADBASELAYERS;
|
|
||||||
|
export class ExpandSearch implements Action {
|
||||||
constructor(public projection: string) { }
|
readonly type = EXPANDSEARCH;
|
||||||
}
|
|
||||||
|
constructor() { }
|
||||||
export class LoadBaseLayersSuccess implements Action {
|
}
|
||||||
readonly type = LOADBASELAYERSSUCCESS;
|
|
||||||
|
export class CollapseSearch implements Action {
|
||||||
constructor(public items: IItem[] ) { }
|
readonly type = COLLAPSESEARCH;
|
||||||
}
|
|
||||||
|
constructor() { }
|
||||||
export class SelectBaseLayer implements Action {
|
}
|
||||||
readonly type = SELECTBASELAYER;
|
|
||||||
|
export class SetExtent implements Action {
|
||||||
constructor(public itemLayer: IItemLayer) { }
|
readonly type = SETEXTENT;
|
||||||
}
|
|
||||||
|
constructor(public extent:number[]) { }
|
||||||
export class SelectOverlayLayer implements Action {
|
}
|
||||||
readonly type = SELECTOVERLAYLAYER;
|
|
||||||
|
export class SetQueryState implements Action {
|
||||||
constructor(public itemLayer: IItemLayer) { }
|
readonly type = SETQUERYSTATE;
|
||||||
}
|
|
||||||
|
constructor(public queryState: IQueryState,public replaceUrl:boolean = true) { }
|
||||||
export class ZoomToExtent implements Action {
|
}
|
||||||
readonly type = ZOOMTOEXTENT;
|
|
||||||
|
export class SetTimeSpan implements Action {
|
||||||
constructor(public itemLayer: IItemLayer) { }
|
readonly type = SETTIMESPAN;
|
||||||
}
|
|
||||||
|
constructor(public startDate: Date, public endDate: Date) { }
|
||||||
export class DoQuery implements Action {
|
}
|
||||||
readonly type = DOQUERY;
|
|
||||||
|
export class AddLayer implements Action {
|
||||||
constructor(public query:IQueryState) { }
|
readonly type = ADDLAYER;
|
||||||
}
|
|
||||||
|
constructor(public item:IItem,public layerIndex=-1) { }
|
||||||
export type Actions = SetMapState
|
}
|
||||||
| Init
|
|
||||||
| SetParent
|
export class SetSelectedItemLayer implements Action {
|
||||||
| StartSearch
|
readonly type = SETSELECTEDITEMLAYER;
|
||||||
| StartSearchSuccess
|
|
||||||
| SelectFeature
|
constructor(public item:IItem,public layerIndex=-1) { }
|
||||||
| SelectItem
|
}
|
||||||
| SelectItemSuccess
|
|
||||||
| AddFeatureSuccess
|
export class SetVisibility implements Action {
|
||||||
| UpdateFeatureSuccess
|
readonly type = SETVISIBILITY;
|
||||||
| ExpandSearch
|
|
||||||
| CollapseSearch
|
constructor(public itemLayer:IItemLayer,public visibility:boolean) { }
|
||||||
| ToggleMenu
|
}
|
||||||
| SetExtent
|
|
||||||
| SetQueryState
|
export class SetOpacity implements Action {
|
||||||
| SetTimeSpan
|
readonly type = SETOPACITY;
|
||||||
| AddLayer
|
|
||||||
| RemoveLayer
|
constructor(public itemLayer: IItemLayer, public opacity: number) { }
|
||||||
| SetVisibility
|
}
|
||||||
| SetOpacity
|
|
||||||
| SetLayerIndex
|
export class SetLayerIndex implements Action {
|
||||||
| LoadBaseLayers
|
readonly type = SETLAYERINDEX;
|
||||||
| LoadBaseLayersSuccess
|
|
||||||
| SelectBaseLayer
|
constructor(public layerIndex: number, public itemLayer: IItemLayer = null) { }
|
||||||
| SelectOverlayLayer
|
}
|
||||||
| ZoomToExtent
|
|
||||||
| SetState
|
export class RemoveLayer implements Action {
|
||||||
| SetViewExtent
|
readonly type = REMOVELAYER;
|
||||||
| DoQuery;
|
|
||||||
|
constructor(public itemLayer: IItemLayer) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
export class ClearLayers implements Action {
|
||||||
|
readonly type = CLEARLAYERS;
|
||||||
|
|
||||||
|
constructor() { }
|
||||||
|
}
|
||||||
|
|
||||||
|
export class LoadBaseLayers implements Action {
|
||||||
|
readonly type = LOADBASELAYERS;
|
||||||
|
|
||||||
|
constructor(public projection: string) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
export class LoadBaseLayersSuccess implements Action {
|
||||||
|
readonly type = LOADBASELAYERSSUCCESS;
|
||||||
|
|
||||||
|
constructor(public items: IItem[] ) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
export class SelectBaseLayer implements Action {
|
||||||
|
readonly type = SELECTBASELAYER;
|
||||||
|
|
||||||
|
constructor(public itemLayer: IItemLayer) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
export class SelectOverlayLayer implements Action {
|
||||||
|
readonly type = SELECTOVERLAYLAYER;
|
||||||
|
|
||||||
|
constructor(public itemLayer: IItemLayer) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
export class ZoomToExtent implements Action {
|
||||||
|
readonly type = ZOOMTOEXTENT;
|
||||||
|
|
||||||
|
constructor(public itemLayer: IItemLayer) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
export class DoQuery implements Action {
|
||||||
|
readonly type = DOQUERY;
|
||||||
|
|
||||||
|
constructor(public query:IQueryState,public replace:boolean = false) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
export class SetStyle implements Action {
|
||||||
|
readonly type = SETSTYLE;
|
||||||
|
|
||||||
|
constructor(public itemType:string,public style: Style | ((feature:Feature<Geometry>) => Style )) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
export class ShowLayerSwitcher implements Action {
|
||||||
|
readonly type = SHOWLAYERSWITCHER;
|
||||||
|
constructor(public show:boolean) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class SetReplaceUrl implements Action {
|
||||||
|
readonly type = SETREPLACEURL;
|
||||||
|
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
|
||||||
|
| Init
|
||||||
|
| Clear
|
||||||
|
| SetParent
|
||||||
|
| StartSearch
|
||||||
|
| StartSearchSuccess
|
||||||
|
| ClickFeature
|
||||||
|
| SelectFeature
|
||||||
|
| SelectItem
|
||||||
|
| SelectItemSuccess
|
||||||
|
| SelectTemporalItemsSuccess
|
||||||
|
| NextTemporal
|
||||||
|
| PreviousTemporal
|
||||||
|
| SelectTemporal
|
||||||
|
| AddFeatureSuccess
|
||||||
|
| UpdateFeatureSuccess
|
||||||
|
| ExpandSearch
|
||||||
|
| CollapseSearch
|
||||||
|
| SetExtent
|
||||||
|
| SetQueryState
|
||||||
|
| SetTimeSpan
|
||||||
|
| AddLayer
|
||||||
|
| RemoveLayer
|
||||||
|
| ClearLayers
|
||||||
|
| SetVisibility
|
||||||
|
| SetOpacity
|
||||||
|
| SetLayerIndex
|
||||||
|
| LoadBaseLayers
|
||||||
|
| LoadBaseLayersSuccess
|
||||||
|
| SelectBaseLayer
|
||||||
|
| SelectOverlayLayer
|
||||||
|
| ZoomToExtent
|
||||||
|
| SetState
|
||||||
|
| SetViewExtent
|
||||||
|
| DoQuery
|
||||||
|
| SetStyle
|
||||||
|
| ShowLayerSwitcher
|
||||||
|
| SetReplaceUrl
|
||||||
|
| SetFeatures
|
||||||
|
| SetSelectedItemLayer
|
||||||
|
| SetLayerValuesLocation
|
||||||
|
| ToggleLayerValuesEnabled
|
||||||
|
| GetLayerValueSuccess
|
||||||
|
| GetLayerValue
|
||||||
|
| SetPeriod
|
||||||
|
| ToggleShowDataLayerSlide
|
||||||
|
| SetViewState
|
||||||
|
| ClearFeatures
|
||||||
|
| SetPanelExtraWide
|
||||||
|
| BackupFeatures
|
||||||
|
| RestoreFeatures;
|
||||||
|
|
||||||
|
|||||||
@@ -1,29 +1,29 @@
|
|||||||
import { NgModule } from '@angular/core';
|
import { NgModule } from '@angular/core';
|
||||||
import { RouterModule } from '@angular/router';
|
import { RouterModule } from '@angular/router';
|
||||||
import { MapComponent } from './components/map/map.component';
|
import { MapComponent } from './components/map/map.component';
|
||||||
import { AuthGuard } from '@farmmaps/common';
|
import { AuthGuard } from '@farmmaps/common';
|
||||||
|
|
||||||
const routes = [
|
const routes = [
|
||||||
{
|
{
|
||||||
path: '', canActivateChild: [AuthGuard], children: [
|
path: '',
|
||||||
{
|
component: MapComponent
|
||||||
path: '',
|
},
|
||||||
component: MapComponent
|
{
|
||||||
}
|
path: ':xCenter/:yCenter/:zoom/:rotation/:baseLayer',
|
||||||
]
|
component: MapComponent
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: ':xCenter/:yCenter/:zoom/:rotation/:baseLayer/:queryState', canActivateChild: [AuthGuard], children: [
|
path: ':xCenter/:yCenter/:zoom/:rotation/:baseLayer/:queryState',
|
||||||
{
|
component: MapComponent
|
||||||
path: '',
|
},
|
||||||
component: MapComponent
|
{
|
||||||
}
|
path: ':queryState',
|
||||||
]
|
component: MapComponent
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [RouterModule.forChild(routes)],
|
imports: [RouterModule.forChild(routes)],
|
||||||
exports: [RouterModule]
|
exports: [RouterModule]
|
||||||
})
|
})
|
||||||
export class MapRoutingModule { }
|
export class MapRoutingModule { }
|
||||||
|
|||||||
@@ -1,245 +1,236 @@
|
|||||||
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';
|
import { IClickedFeature } from './models/clicked.feature';
|
||||||
import { ISelectedFeatures } from './models';
|
import { IItemLayer, ItemLayer, ITemporalItemLayer, TemporalItemLayer } from './models/item.layer';
|
||||||
import { IItemLayer } from './models';
|
import { IMapState } from './models/map.state';
|
||||||
import { ItemLayer} from './models';
|
import { IPeriodState } from './models/period.state';
|
||||||
import { IQueryState } from './models';
|
import { ISelectedFeatures } from './models/selected.features';
|
||||||
import { IPeriodState } from './models';
|
|
||||||
|
|
||||||
// components
|
// components
|
||||||
import { GpsLocation} from './components/aol/gps-location/gps-location.component';
|
import { MapRoutingModule } from './common-map-routing.module';
|
||||||
//import {Switch2D3DComponent } from './components/aol/switch2d3d/switch2d3d.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 { 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 {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 { ItemFeaturesSourceComponent } from './components/aol/item-features-source/item-features-source.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';
|
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 { StateSerializerService } from './services/state-serializer.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 { localStorageSync } from 'ngrx-store-localstorage';
|
|
||||||
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 { GeolocationService } from './services/geolocation.service';
|
||||||
|
import { TemporalService } from './services/temporal.service';
|
||||||
|
|
||||||
|
export function LocalStorageSync(reducer: ActionReducer<any>): ActionReducer<any> {
|
||||||
|
const r = function(state, action) {
|
||||||
|
const r2 = reducer(state, action);
|
||||||
|
|
||||||
|
if(action.type == "@ngrx/store/update-reducers") {
|
||||||
|
const ms = window.localStorage.getItem(MODULE_NAME+"_mapState");
|
||||||
|
if(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") {
|
||||||
|
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 r;
|
||||||
|
}
|
||||||
|
|
||||||
|
const metaReducers: Array<MetaReducer<any, any>> = [LocalStorageSync];
|
||||||
|
|
||||||
export {
|
export {
|
||||||
mapEffects,
|
|
||||||
mapReducers,
|
|
||||||
mapActions,
|
|
||||||
ZoomToExtentComponent,
|
|
||||||
ItemVectorSourceComponent,
|
|
||||||
ItemFeaturesSourceComponent,
|
|
||||||
ItemLayersComponent,
|
|
||||||
FileDropTargetComponent,
|
|
||||||
MapComponent,
|
|
||||||
MetaDataModalComponent,
|
|
||||||
RotationResetComponent,
|
|
||||||
MapSearchComponent,
|
|
||||||
SelectPeriodModalComponent,
|
|
||||||
LayerListComponent,
|
|
||||||
LegendComponent,
|
|
||||||
LayerVectorImageComponent,
|
|
||||||
FeatureListComponent,
|
|
||||||
WidgetHostDirective,
|
|
||||||
FeatureListContainerComponent,
|
|
||||||
FeatureListCroppingschemeComponent,
|
|
||||||
FeatureListCropfieldComponent,
|
|
||||||
FeatureListFeatureContainerComponent,
|
|
||||||
FeatureListFeatureComponent,
|
|
||||||
FeatureListFeatureCroppingschemeComponent,
|
|
||||||
FeatureListFeatureCropfieldComponent,
|
|
||||||
SelectedItemContainerComponent,
|
|
||||||
SelectedItemComponent,
|
|
||||||
SelectedItemCropfieldComponent,
|
|
||||||
SelectedItemGeotiffComponent,
|
|
||||||
SelectedItemShapeComponent,
|
|
||||||
ItemListItemComponent,
|
|
||||||
ItemListItemContainerComponent,
|
|
||||||
ItemListComponent,
|
|
||||||
ItemWidgetListComponent,
|
|
||||||
WidgetStatusComponent,
|
|
||||||
GpsLocation,
|
|
||||||
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
|
||||||
StateSerializerService,
|
};
|
||||||
GeolocationService,
|
|
||||||
IMapState,
|
|
||||||
ISelectedFeatures,
|
|
||||||
IItemLayer,
|
|
||||||
ItemLayer,
|
|
||||||
IQueryState,
|
|
||||||
IPeriodState,
|
|
||||||
ForChild,
|
|
||||||
ForItemType,
|
|
||||||
ForSourceTask
|
|
||||||
}
|
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [
|
imports: [
|
||||||
CommonModule,
|
CommonModule,
|
||||||
AngularOpenlayersModule,
|
AngularOpenlayersModule,
|
||||||
MapRoutingModule,
|
MapRoutingModule,
|
||||||
StoreModule.forFeature(MODULE_NAME, mapReducers.reducer),
|
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,
|
||||||
ItemFeaturesSourceComponent,
|
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,
|
FeatureListObservationComponent,
|
||||||
FeatureListFeatureContainerComponent,
|
FeatureListFeatureContainerComponent,
|
||||||
FeatureListFeatureComponent,
|
FeatureListFeatureComponent,
|
||||||
FeatureListFeatureCroppingschemeComponent,
|
FeatureListFeatureCroppingschemeComponent,
|
||||||
FeatureListFeatureCropfieldComponent,
|
FeatureListFeatureCropfieldComponent,
|
||||||
SelectedItemContainerComponent,
|
SelectedItemContainerComponent,
|
||||||
SelectedItemComponent,
|
SelectedItemComponent,
|
||||||
SelectedItemCropfieldComponent,
|
SelectedItemCropfieldComponent,
|
||||||
SelectedItemGeotiffComponent,
|
SelectedItemGeotiffComponent,
|
||||||
SelectedItemShapeComponent,
|
SelectedItemTemporalComponent,
|
||||||
ItemListItemComponent,
|
SelectedItemShapeComponent,
|
||||||
ItemListItemContainerComponent,
|
ItemListItemComponent,
|
||||||
ItemListComponent,
|
ItemListItemContainerComponent,
|
||||||
ItemWidgetListComponent,
|
ItemListComponent,
|
||||||
WidgetStatusComponent,
|
ItemWidgetListComponent,
|
||||||
GpsLocation,
|
WidgetStatusComponent,
|
||||||
],
|
GpsLocation,
|
||||||
entryComponents: [
|
PanToLocation,
|
||||||
FeatureListComponent,
|
LayerSwitcher,
|
||||||
FeatureListCroppingschemeComponent,
|
HistogramDetailsComponent,
|
||||||
FeatureListCropfieldComponent,
|
StatisticsDetailsComponent,
|
||||||
FeatureListFeatureComponent,
|
ifZoomToShowDirective,
|
||||||
FeatureListFeatureCroppingschemeComponent,
|
ZoomToShowAlert,
|
||||||
FeatureListFeatureCropfieldComponent,
|
LayerValuesComponent,
|
||||||
SelectedItemComponent,
|
GeometryThumbnailComponent
|
||||||
SelectedItemCropfieldComponent,
|
],
|
||||||
SelectedItemGeotiffComponent,
|
exports: [
|
||||||
SelectedItemShapeComponent,
|
ItemVectorSourceComponent,
|
||||||
ItemListComponent,
|
ItemLayersComponent,
|
||||||
ItemListItemComponent,
|
FileDropTargetComponent,
|
||||||
],
|
MetaDataModalComponent,
|
||||||
exports: [
|
MapComponent,
|
||||||
ItemVectorSourceComponent,
|
GpsLocation,
|
||||||
ItemFeaturesSourceComponent,
|
PanToLocation,
|
||||||
ItemLayersComponent,
|
LayerSwitcher,
|
||||||
FileDropTargetComponent,
|
FeatureListFeatureComponent,
|
||||||
MetaDataModalComponent,
|
FeatureListFeatureCropfieldComponent,
|
||||||
MapComponent,
|
FeatureListFeatureCroppingschemeComponent,
|
||||||
GpsLocation,
|
SelectedItemContainerComponent,
|
||||||
FeatureListFeatureComponent,
|
SelectedItemComponent,
|
||||||
FeatureListFeatureCropfieldComponent,
|
SelectedItemCropfieldComponent,
|
||||||
FeatureListFeatureCroppingschemeComponent,
|
SelectedItemGeotiffComponent,
|
||||||
SelectedItemContainerComponent,
|
SelectedItemTemporalComponent,
|
||||||
SelectedItemComponent,
|
SelectedItemShapeComponent,
|
||||||
SelectedItemCropfieldComponent,
|
ItemListItemComponent,
|
||||||
SelectedItemGeotiffComponent,
|
ItemListItemContainerComponent,
|
||||||
SelectedItemShapeComponent,
|
ItemListComponent,
|
||||||
ItemListItemComponent,
|
ItemWidgetListComponent,
|
||||||
ItemListItemContainerComponent,
|
WidgetStatusComponent,
|
||||||
ItemListComponent,
|
RotationResetComponent,
|
||||||
ItemWidgetListComponent,
|
MapSearchComponent,
|
||||||
WidgetStatusComponent,
|
SelectPeriodModalComponent,
|
||||||
RotationResetComponent,
|
LayerListComponent,
|
||||||
MapSearchComponent,
|
LegendComponent,
|
||||||
SelectPeriodModalComponent,
|
LayerVectorImageComponent,
|
||||||
LayerListComponent,
|
FeatureListComponent,
|
||||||
LegendComponent,
|
WidgetHostDirective,
|
||||||
LayerVectorImageComponent,
|
FeatureListContainerComponent,
|
||||||
FeatureListComponent,
|
FeatureListCroppingschemeComponent,
|
||||||
WidgetHostDirective,
|
FeatureListCropfieldComponent,
|
||||||
FeatureListContainerComponent,
|
FeatureListObservationComponent,
|
||||||
FeatureListCroppingschemeComponent,
|
FeatureListFeatureContainerComponent,
|
||||||
FeatureListCropfieldComponent,
|
ZoomToExtentComponent,
|
||||||
FeatureListFeatureContainerComponent,
|
ifZoomToShowDirective,
|
||||||
ZoomToExtentComponent
|
ZoomToShowAlert,
|
||||||
]
|
GeometryThumbnailComponent
|
||||||
})
|
],
|
||||||
|
providers: [
|
||||||
export class AppCommonMapModule {
|
FeatureIconService,
|
||||||
static forRoot(): ModuleWithProviders {
|
|
||||||
return {
|
|
||||||
ngModule: AppCommonMapModule,
|
|
||||||
providers: [
|
|
||||||
StateSerializerService,
|
|
||||||
GeolocationService,
|
GeolocationService,
|
||||||
|
DeviceOrientationService,
|
||||||
|
TemporalService,
|
||||||
{ provide: AbstractFeatureListComponent, useClass: FeatureListCroppingschemeComponent, multi: true },
|
{ provide: AbstractFeatureListComponent, useClass: FeatureListCroppingschemeComponent, multi: true },
|
||||||
{ provide: AbstractFeatureListComponent, useClass: FeatureListCropfieldComponent, multi: true },
|
{ provide: AbstractFeatureListComponent, useClass: FeatureListCropfieldComponent, multi: true },
|
||||||
|
{ provide: AbstractFeatureListComponent, useClass: FeatureListObservationComponent, multi: true },
|
||||||
{ provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureComponent, multi: true },
|
{ provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureComponent, multi: true },
|
||||||
{ provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureCroppingschemeComponent, multi: true },
|
{ provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureCroppingschemeComponent, multi: true },
|
||||||
{ provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureCropfieldComponent, multi: true },
|
{ provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureCropfieldComponent, multi: true },
|
||||||
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemComponent, multi: true },
|
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemComponent, multi: true },
|
||||||
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemCropfieldComponent, multi: true },
|
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemCropfieldComponent, multi: true },
|
||||||
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemGeotiffComponent, multi: true },
|
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemGeotiffComponent, multi: true },
|
||||||
|
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemTemporalComponent, multi: true },
|
||||||
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemShapeComponent, multi: true },
|
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemShapeComponent, multi: true },
|
||||||
{ provide: AbstractItemListItemComponent, useClass: ItemListItemComponent, multi: true },
|
{ provide: AbstractItemListItemComponent, useClass: ItemListItemComponent, multi: true },
|
||||||
{ provide: AbstractItemListComponent, useClass: ItemListComponent, multi: true }
|
{ provide: AbstractItemListComponent, useClass: ItemListComponent, multi: true }
|
||||||
]
|
]
|
||||||
};
|
})
|
||||||
}
|
|
||||||
|
|
||||||
|
export class AppCommonMapModule {
|
||||||
}
|
}
|
||||||
|
|||||||
+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
-9
@@ -1,7 +1,3 @@
|
|||||||
@import "../../../_theme.scss";
|
|
||||||
@import "~bootstrap/scss/bootstrap.scss";
|
|
||||||
|
|
||||||
|
|
||||||
.gps-location {
|
.gps-location {
|
||||||
display:none;
|
display:none;
|
||||||
}
|
}
|
||||||
@@ -10,26 +6,34 @@
|
|||||||
stroke-width: 0;
|
stroke-width: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.heading.hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
.tolerance {
|
.tolerance {
|
||||||
fill: theme-color();
|
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: theme-color();
|
fill: var(--bs-primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
.stop1 {
|
.stop1 {
|
||||||
stop-color: theme-color();
|
stop-color: var(--bs-primary);
|
||||||
stop-opacity:1;
|
stop-opacity:1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.stop2 {
|
.stop2 {
|
||||||
stop-color: theme-color();
|
stop-color:var(--bs-primary);
|
||||||
stop-opacity: 0;
|
stop-opacity: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+75
-67
@@ -1,68 +1,76 @@
|
|||||||
import { Component, OnInit, Input, ViewChild, ElementRef, OnChanges, SimpleChanges } 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;
|
|
||||||
public instance: Overlay;
|
@Input() enable:boolean;
|
||||||
@Input() position: Position;
|
public instance: Overlay;
|
||||||
@Input() location: number[]=[0,0];
|
@Input() position: GeolocationPosition;
|
||||||
@Input() locationTolerance: number = 0;
|
@Input() location: number[]=[0,0];
|
||||||
@Input() showHeading: boolean = false;
|
@Input() locationTolerance = 0;
|
||||||
@Input() heading: number = 0;
|
@Input() showHeading = false;
|
||||||
@Input() headingTolerance: number = 0;
|
@Input() showTolerance = false;
|
||||||
public locTolerancePixels: number = 0;
|
@Input() heading = 0;
|
||||||
public path: string = "";
|
@Input() headingTolerance = 0;
|
||||||
public rotate: string = "";
|
public locTolerancePixels = 0;
|
||||||
private resolution: number = 0;
|
public path = "";
|
||||||
@ViewChild('location') locationElement: ElementRef;
|
public rotate = "";
|
||||||
|
private resolution = 0;
|
||||||
constructor(private map: MapComponent) {
|
initialized = false;
|
||||||
|
@ViewChild('location', { static: true }) locationElement: ElementRef;
|
||||||
}
|
|
||||||
|
constructor(private map: MapComponent) {
|
||||||
recalcLocationTolerance() {
|
|
||||||
this.locTolerancePixels = this.resolution >0? this.locationTolerance / this.resolution:0;
|
}
|
||||||
}
|
|
||||||
|
recalcLocationTolerance() {
|
||||||
ngOnInit() {
|
this.locTolerancePixels = this.resolution >0? this.locationTolerance / this.resolution:0;
|
||||||
this.instance = new Overlay({
|
}
|
||||||
stopEvent:false,
|
|
||||||
positioning: 'center-center',
|
ngOnInit() {
|
||||||
position: fromLonLat( this.location),
|
this.instance = new Overlay({
|
||||||
element: this.locationElement.nativeElement
|
stopEvent:false,
|
||||||
});
|
positioning: 'center-center',
|
||||||
var x = Math.tan(this.headingTolerance * Math.PI / 180)*40;
|
position: fromLonLat( this.location),
|
||||||
var y = Math.cos(this.headingTolerance * Math.PI / 180) * 40;
|
element: this.locationElement.nativeElement
|
||||||
var y1 = Math.round(500 - y);
|
});
|
||||||
var x1 = Math.round(500 - x);
|
const x = Math.tan(this.headingTolerance * Math.PI / 180)*40;
|
||||||
var y2 = Math.round(y1);
|
const y = Math.cos(this.headingTolerance * Math.PI / 180) * 40;
|
||||||
var x2 = Math.round(500 + x);
|
const y1 = Math.round(500 - y);
|
||||||
this.path = "M " + x2 + " " + y2 + " A 45 45,0,0,0, " + x1 + " " + y1 + " L 493 500 L 507 500 Z";
|
const x1 = Math.round(500 - x);
|
||||||
this.rotate = "rotate(" + Math.round(this.heading) + " 500 500)";
|
const y2 = Math.round(y1);
|
||||||
this.locTolerancePixels = this.locationTolerance;
|
const x2 = Math.round(500 + x);
|
||||||
this.map.instance.addOverlay(this.instance);
|
this.path = "M " + x2 + " " + y2 + " A 45 45,0,0,0, " + x1 + " " + y1 + " L 493 500 L 507 500 Z";
|
||||||
this.map.instance.getView().on('change:resolution', (evt) => {
|
this.rotate = "rotate(" + Math.round(this.heading) + " 500 500)";
|
||||||
this.resolution = evt.target.get('resolution');
|
this.locTolerancePixels = this.locationTolerance;
|
||||||
this.recalcLocationTolerance();
|
this.map.instance.addOverlay(this.instance);
|
||||||
});
|
this.map.instance.getView().on('change:resolution', (evt:any) => {
|
||||||
}
|
this.resolution = evt.target.get('resolution');
|
||||||
|
this.recalcLocationTolerance();
|
||||||
ngOnChanges(changes: SimpleChanges) {
|
});
|
||||||
if (changes.position && this.instance) {
|
this.initialized = true;
|
||||||
var p = changes.position.currentValue as Position;
|
}
|
||||||
this.instance.setPosition(fromLonLat([p.coords.longitude, p.coords.latitude]));
|
|
||||||
this.locationTolerance = p.coords.accuracy;
|
ngOnChanges(changes: SimpleChanges) {
|
||||||
this.recalcLocationTolerance();
|
if (changes.position && this.instance) {
|
||||||
this.heading = p.coords.heading;
|
const p = changes.position.currentValue as GeolocationPosition;
|
||||||
}
|
if(p && this.initialized) {
|
||||||
}
|
this.instance.setPosition(fromLonLat([p.coords.longitude, p.coords.latitude]));
|
||||||
}
|
this.locationTolerance = p.coords.accuracy;
|
||||||
|
this.recalcLocationTolerance();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(changes.heading && this.instance) {
|
||||||
|
this.rotate = "rotate(" + Math.round(changes.heading.currentValue) + " 500 500)";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
-90
@@ -1,90 +0,0 @@
|
|||||||
import { Component, Host, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, forwardRef, Inject, InjectionToken } from '@angular/core';
|
|
||||||
import { HttpClient } from "@angular/common/http";
|
|
||||||
import { LayerVectorComponent, SourceVectorComponent, MapComponent, LayerImageComponent } from 'ngx-openlayers';
|
|
||||||
import { LayerVectorImageComponent } from '../layer-vector-image/layer-vector-image.component';
|
|
||||||
import { ItemService } from '@farmmaps/common';
|
|
||||||
import { IItem } from '@farmmaps/common';
|
|
||||||
import { ISelectedFeatures } from '../../../models';
|
|
||||||
|
|
||||||
import {Vector} from 'ol/source';
|
|
||||||
import {Feature,Collection} from 'ol';
|
|
||||||
import {Extent} from 'ol/extent';
|
|
||||||
import * as style from 'ol/style';
|
|
||||||
import * as proj from 'ol/proj';
|
|
||||||
import Projection from 'ol/proj/Projection';
|
|
||||||
import * as loadingstrategy from 'ol/loadingstrategy';
|
|
||||||
import {GeoJSON} from 'ol/format';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'fm-map-item-features-source',
|
|
||||||
template: `<ng-content></ng-content>`,
|
|
||||||
providers: [
|
|
||||||
{ provide: SourceVectorComponent, useExisting: forwardRef(() => ItemFeaturesSourceComponent) }
|
|
||||||
]
|
|
||||||
})
|
|
||||||
|
|
||||||
export class ItemFeaturesSourceComponent extends SourceVectorComponent implements OnInit, OnChanges {
|
|
||||||
instance:Vector;
|
|
||||||
features: Collection<Feature>;
|
|
||||||
@Input() item: IItem;
|
|
||||||
@Input() layerIndex: number = 0;
|
|
||||||
constructor(@Host() private layer: LayerVectorImageComponent, private itemService: ItemService, @Host() private map: MapComponent) {
|
|
||||||
super(layer);
|
|
||||||
}
|
|
||||||
|
|
||||||
private colorIndex = 0;
|
|
||||||
private styleCache = {};
|
|
||||||
|
|
||||||
ngOnInit() {
|
|
||||||
this.instance = new Vector({
|
|
||||||
loader: (extent: Extent, resolution: number, projection: Projection) => {
|
|
||||||
let format = new GeoJSON();
|
|
||||||
this.itemService.getItemFeatures(this.item.code, extent, projection.getCode(), this.layerIndex).subscribe((data) => {
|
|
||||||
var features = format.readFeatures(data);
|
|
||||||
// TODO 13/6/2019 The line below causes an endless loop. Action required?
|
|
||||||
this.instance.addFeatures(features);
|
|
||||||
// TODO 13/6/2019 Action required: check if feature collection hasn't been changed (Willem)
|
|
||||||
// var t = this.vectorSource.getFeatures();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
format: new GeoJSON(),
|
|
||||||
strategy: loadingstrategy.bbox
|
|
||||||
});
|
|
||||||
this.features = new Collection<Feature>();
|
|
||||||
this.layer.instance
|
|
||||||
this.layer.instance.setStyle((feature) => {
|
|
||||||
var resolution = this.map.instance.getView().getResolution();
|
|
||||||
var r = (2 / resolution) / 2;
|
|
||||||
var color = feature.get("color");
|
|
||||||
return new style.Style(
|
|
||||||
{
|
|
||||||
fill: new style.Fill({
|
|
||||||
color: color
|
|
||||||
}),
|
|
||||||
image: new style.Circle({
|
|
||||||
fill: new style.Fill({
|
|
||||||
color: color
|
|
||||||
}),
|
|
||||||
stroke: new style.Stroke({
|
|
||||||
color: color,
|
|
||||||
width: 1.25
|
|
||||||
}),
|
|
||||||
radius: r
|
|
||||||
}),
|
|
||||||
stroke: new style.Stroke({
|
|
||||||
color: color,
|
|
||||||
width: 1.25
|
|
||||||
})
|
|
||||||
});
|
|
||||||
});
|
|
||||||
this.host.instance.setSource(this.instance);
|
|
||||||
}
|
|
||||||
|
|
||||||
ngOnChanges(changes: SimpleChanges) {
|
|
||||||
if (this.instance) {
|
|
||||||
if (changes['layerIndex']) {
|
|
||||||
this.instance.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+530
-276
@@ -1,276 +1,530 @@
|
|||||||
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 } from '@farmmaps/common';
|
import { IItemLayer, ITemporalItemLayer} from '../../../models/item.layer';
|
||||||
import { AppConfig } from '@farmmaps/common';
|
import { ILayerData} from '../../../models/layer.data';
|
||||||
import { IItemLayer, ILayerData, IRenderoutputTiles, IRenderoutputImage, IGradientstop, ILayer, IHistogram } from '../../../models';
|
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,Source} from 'ol/source';
|
||||||
import {XYZ,ImageStatic,OSM,BingMaps,TileWMS,TileArcGISRest} 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';
|
||||||
@Component({
|
import Feature from 'ol/Feature';
|
||||||
selector: 'fm-map-item-layers',
|
|
||||||
template: `<ng-content></ng-content>`,
|
@Component({
|
||||||
providers: [
|
selector: 'fm-map-item-layers',
|
||||||
{ provide: LayerGroupComponent, useExisting: forwardRef(() => ItemLayersComponent) }
|
template: `<ng-content></ng-content>`,
|
||||||
]
|
providers: [
|
||||||
})
|
{ provide: LayerGroupComponent, useExisting: forwardRef(() => ItemLayersComponent) }
|
||||||
|
],
|
||||||
export class ItemLayersComponent extends LayerGroupComponent implements OnChanges, OnInit {
|
standalone: false
|
||||||
@Input() itemLayers: IItemLayer[];
|
})
|
||||||
@Input() itemLayer: IItemLayer;
|
|
||||||
private _apiEndPoint: string;
|
export class ItemLayersComponent extends LayerGroupComponent implements OnChanges, OnInit,OnDestroy {
|
||||||
|
@Input() itemLayers: IItemLayer[];
|
||||||
constructor(private itemService: ItemService, @Host() private map: MapComponent, public appConfig: AppConfig) {
|
@Input() itemLayer: IItemLayer;
|
||||||
super(map);
|
@Output() onFeatureSelected: EventEmitter<any> = new EventEmitter<any>();
|
||||||
this._apiEndPoint = appConfig.getConfig("apiEndPoint");
|
@Output() onFeatureHover: EventEmitter<any> = new EventEmitter<any>();
|
||||||
}
|
@Output() onPrerender: EventEmitter<any> = new EventEmitter<any>();
|
||||||
|
private _apiEndPoint: string;
|
||||||
private styleCache = {}
|
private initialized = false;
|
||||||
|
private mapEventHandlerInstalled = false;
|
||||||
componentToHex(c) {
|
private topLayerPrerenderEventhandlerInstalled = false;
|
||||||
var hex = c.toString(16);
|
private selectedFeatures = {};
|
||||||
return hex.length == 1 ? "0" + hex : hex;
|
private selectionLayer:Layer<Source> = null;
|
||||||
}
|
|
||||||
|
constructor(private itemService: ItemService, private map: MapComponent, public appConfig: AppConfig) {
|
||||||
rgbaToHex(r, g, b,a) {
|
super(map);
|
||||||
return "#" + this.componentToHex(r) + this.componentToHex(g) + this.componentToHex(b) + this.componentToHex(a);
|
this._apiEndPoint = appConfig.getConfig("apiEndPoint");
|
||||||
}
|
}
|
||||||
|
|
||||||
getColorFromGradient(layer: ILayer, feature): style.Style {
|
private styleCache = {}
|
||||||
var value = feature.get(layer.name);
|
|
||||||
var gradient: IGradientstop[] = layer.renderer.colorMap.gradient;
|
componentToHex(c) {
|
||||||
var histogram: IHistogram = layer.renderer.band.histogram;
|
const hex = c.toString(16);
|
||||||
var index = (value - histogram.min) / histogram.max;
|
return hex.length == 1 ? "0" + hex : hex;
|
||||||
var min = gradient[0];
|
}
|
||||||
var max = gradient[gradient.length - 1];
|
|
||||||
for (var n = 0; n < gradient.length; n++) {
|
rgbaToHex(r, g, b,a) {
|
||||||
var s = gradient[n];
|
return "#" + this.componentToHex(r) + this.componentToHex(g) + this.componentToHex(b) + this.componentToHex(a);
|
||||||
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;
|
|
||||||
}
|
getColorFromGradient(layer: ILayer, value: number): IColor {
|
||||||
var i = index - min.relativestop;
|
const gradient: IGradientstop[] = layer.renderer.colorMap.gradient;
|
||||||
var size = max.relativestop - min.relativestop;
|
const histogram: IHistogram = layer.renderer.band.histogram;
|
||||||
var alpha = Math.round( min.color.alpha + ((max.color.alpha - min.color.alpha) * i / size));
|
const index = (value - histogram.min) / histogram.max;
|
||||||
var red = Math.round(min.color.red + ((max.color.red - min.color.red) * i / size));
|
let min = gradient[0];
|
||||||
var green = Math.round(min.color.green + ((max.color.green - min.color.green) * i / size));
|
let max = gradient[gradient.length - 1];
|
||||||
var blue = Math.round(min.color.blue + ((max.color.blue - min.color.blue) * i / size));
|
for (let n = 0; n < gradient.length; n++) {
|
||||||
|
const s = gradient[n];
|
||||||
return new style.Style(
|
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;
|
||||||
image: new style.Circle({
|
}
|
||||||
fill: new style.Fill({
|
const i = index - min.relativestop;
|
||||||
color: this.rgbaToHex(red,green,blue,alpha)
|
const size = max.relativestop - min.relativestop;
|
||||||
}),
|
const alpha = Math.round(min.color.alpha + ((max.color.alpha - min.color.alpha) * i / size));
|
||||||
radius: 3
|
const red = Math.round(min.color.red + ((max.color.red - min.color.red) * i / size));
|
||||||
}),
|
const green = Math.round(min.color.green + ((max.color.green - min.color.green) * i / size));
|
||||||
fill: new style.Fill({
|
const blue = Math.round(min.color.blue + ((max.color.blue - min.color.blue) * i / size));
|
||||||
color: this.rgbaToHex(red, green, blue, alpha)
|
|
||||||
}),
|
return { alpha: alpha, red: red, green: green, blue: blue };
|
||||||
stroke: new style.Stroke({
|
}
|
||||||
color: this.rgbaToHex(red, green, blue, alpha),
|
|
||||||
width: 1.25
|
getColorForValue(layer: ILayer, value: number): IColor {
|
||||||
}),
|
let color: IColor = { alpha:0,red:0,green:0,blue:0};
|
||||||
});
|
if(layer.renderer.colorMap.entries.length>0) {
|
||||||
}
|
color=layer.renderer.colorMap.noValue;
|
||||||
|
}
|
||||||
createLayer(itemLayer: IItemLayer): Layer {
|
layer.renderer.colorMap.entries.forEach((entry) => {
|
||||||
var layer: Layer = null;
|
if(entry.value==value) {
|
||||||
if (itemLayer.item.itemType == 'vnd.farmmaps.itemtype.geotiff.processed') {
|
color =entry.color;
|
||||||
let source = new XYZ({ maxZoom: 19, minZoom: 1, url: `${this._apiEndPoint}/api/v1/items/${itemLayer.item.code}/tiles/{z}/{x}/{y}.png?v=${itemLayer.item.updated.getTime()}` });
|
return;
|
||||||
layer = new Tile({ source: source });
|
}
|
||||||
var data = itemLayer.item.data;
|
});
|
||||||
var l = (data && data.layers && data.layers.length > 0) ? data.layers[0] : null;
|
|
||||||
if (l && l.rendering && l.rendering.renderoutputType == "Tiles") {
|
return color;
|
||||||
var rt = l.rendering as IRenderoutputTiles;
|
}
|
||||||
let source = new XYZ({ maxZoom: rt.maxzoom, minZoom: rt.minzoom, url: `${this._apiEndPoint}/api/v1/items/${itemLayer.item.code}/tiles/{z}/{x}/{y}.png?v=${itemLayer.item.updated.getTime()}` });
|
|
||||||
layer = new Tile({ source: source });
|
getColor(item: IItem, layer: ILayer, feature): style.Style {
|
||||||
}
|
const value = layer.indexKey ? feature.get(layer.indexKey) : feature.get(layer.name);
|
||||||
if (l && l.rendering && l.rendering.renderoutputType == "Image") {
|
const key = item.code + "_" + value;
|
||||||
var ri = l.rendering as IRenderoutputImage;
|
if (!this.styleCache[key]) {
|
||||||
let projection = new Projection({
|
let color: IColor;
|
||||||
code: 'image',
|
if(layer.renderer.colorMap.colormapType == "manual") {
|
||||||
units: 'pixels',
|
color = this.getColorForValue(layer, value);
|
||||||
extent: ri.extent
|
} else {
|
||||||
});
|
color = this.getColorFromGradient(layer, value);
|
||||||
let source = new ImageStatic({ imageExtent: ri.extent, projection: projection, url: `${this._apiEndPoint}/api/v1/items/${itemLayer.item.code}/mapimage?v=${itemLayer.item.updated.getTime()}` });
|
}
|
||||||
layer = new Image({ source: source });
|
|
||||||
}
|
this.styleCache[key] = new style.Style(
|
||||||
} else if (itemLayer.item.itemType == 'vnd.farmmaps.itemtype.shape.processed') {
|
{
|
||||||
var data = itemLayer.item.data;
|
image: new style.Circle({
|
||||||
var layerIndex = itemLayer.layerIndex != -1 ? itemLayer.layerIndex : itemLayer.item.data.layers[0].index;
|
fill: new style.Fill({
|
||||||
var l = itemLayer.item.data.layers[layerIndex];
|
color: this.rgbaToHex(color.red, color.green, color.blue, color.alpha)
|
||||||
if (l && l.rendering && l.rendering.renderoutputType == "VectorTiles") {
|
}),
|
||||||
var rt = itemLayer.item.data.layers[layerIndex].rendering as IRenderoutputTiles;
|
radius: 3
|
||||||
layer = new VectorTileLayer({
|
}),
|
||||||
declutter: true,
|
fill: new style.Fill({
|
||||||
source: new VectorTileSource({
|
color: this.rgbaToHex(color.red, color.green, color.blue, color.alpha)
|
||||||
maxZoom: rt.maxzoom,
|
}),
|
||||||
minZoom: rt.minzoom,
|
stroke: new style.Stroke({
|
||||||
format: new MVT(),
|
color: this.rgbaToHex(color.red, color.green, color.blue, 255),
|
||||||
url: `${this._apiEndPoint}/api/v1/items/${itemLayer.item.code}/vectortiles/{z}/{x}/{y}.pbf?v=${itemLayer.item.updated.getTime()}`
|
width: 1.25
|
||||||
}),
|
}),
|
||||||
style: (feature) => {
|
});
|
||||||
return this.getColorFromGradient(l, feature);
|
}
|
||||||
}
|
return this.styleCache[key];
|
||||||
})
|
}
|
||||||
} if (l && l.rendering && l.rendering.renderoutputType == "Tiles") {
|
|
||||||
var rt = l.rendering as IRenderoutputTiles;
|
createGeotiffLayer(item:IItem,itemLayer:IItemLayer):Layer<Source> {
|
||||||
layer = new Tile({
|
let layerIndex = -1;
|
||||||
source: new XYZ({
|
let layer: Layer<Source> = null;
|
||||||
maxZoom: rt.maxzoom,
|
layerIndex = itemLayer.layerIndex != -1 ? itemLayer.layerIndex : item.data.layers[0].index;
|
||||||
minZoom: rt.minzoom,
|
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)}` });
|
||||||
url: `${this._apiEndPoint}/api/v1/items/${itemLayer.item.code}/vectortiles/image_tiles/${layerIndex}/{z}/{x}/{y}.png?v=${itemLayer.item.updated.getTime()}`
|
layer = new Tile({ source: source });
|
||||||
})
|
const data = item.data;
|
||||||
});
|
const l = (data && data.layers && data.layers.length > 0) ? data.layers[0] : null;
|
||||||
} else {
|
if (l && l.rendering && l.rendering.renderoutputType == "Tiles") {
|
||||||
let __this = this;
|
const rt = l.rendering as IRenderoutputTiles;
|
||||||
let format = new GeoJSON();
|
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)}` });
|
||||||
let source = new VectorSource({
|
layer = new Tile({ source: source });
|
||||||
strategy: loadingstrategy.bbox,
|
}
|
||||||
loader: function (extent: Extent, resolution: number, projection: Projection) {
|
if (l && l.rendering && l.rendering.renderoutputType == "Image") {
|
||||||
var source = this as VectorSource;
|
const ri = l.rendering as IRenderoutputImage;
|
||||||
__this.itemService.getItemFeatures(itemLayer.item.code, extent, projection.getCode(), layerIndex).subscribe(function (data) {
|
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 features = format.readFeatures(data);
|
layer = new Image({ source: source });
|
||||||
for (let f of features) {
|
}
|
||||||
if (f.get("code")) {
|
return layer;
|
||||||
f.setId(f.get("code"));
|
}
|
||||||
}
|
|
||||||
}
|
createShapeLayer(item:IItem,itemLayer:IItemLayer):Layer<Source> {
|
||||||
source.addFeatures(features);
|
let layerIndex = -1;
|
||||||
});
|
let layer: Layer<Source> = null;
|
||||||
}
|
layerIndex = itemLayer.layerIndex != -1 ? itemLayer.layerIndex : item.data.layers[0].index;
|
||||||
});
|
const data = item.data;
|
||||||
layer = new VectorLayer({
|
const l:ILayer = (data && data.layers && data.layers.length > 0) ? data.layers[layerIndex] : null;
|
||||||
source: source,
|
if (l && l.rendering && l.rendering.renderoutputType == "VectorTiles") {
|
||||||
style: (feature) => {
|
var rt = l.rendering as IRenderoutputTiles;
|
||||||
var key = feature.get("color");
|
layer = new VectorTileLayer({
|
||||||
if (!this.styleCache[key]) {
|
declutter: true,
|
||||||
var color = feature.get("color");
|
source: new VectorTileSource({
|
||||||
this.styleCache[key] = new style.Style(
|
maxZoom: rt.maxzoom,
|
||||||
{
|
minZoom: rt.minzoom,
|
||||||
fill: new style.Fill({
|
format: new MVT(),
|
||||||
color: color
|
url: `${this._apiEndPoint}/api/v1/items/${item.code}/vectortiles/{z}/{x}/{y}.pbf?v=${Date.parse(item.updated)}`
|
||||||
}),
|
}),
|
||||||
stroke: new style.Stroke({
|
style: (feature) => {
|
||||||
color: color,
|
return this.getColor(item,l, feature);
|
||||||
width: 1.25
|
}
|
||||||
}),
|
})
|
||||||
image: new style.Circle({
|
} else if (l && l.rendering && l.rendering.renderoutputType == "Tiles") {
|
||||||
fill: new style.Fill({
|
var rt = l.rendering as IRenderoutputTiles;
|
||||||
color: color
|
layer = new Tile({
|
||||||
}),
|
source: new XYZ({
|
||||||
stroke: new style.Stroke({
|
maxZoom: rt.maxzoom,
|
||||||
color: color,
|
minZoom: rt.minzoom,
|
||||||
width: 1.25
|
url: `${this._apiEndPoint}/api/v1/items/${item.code}/vectortiles/image_tiles/${layerIndex}/{z}/{x}/{y}.png?v=${Date.parse(item.updated)}`
|
||||||
}),
|
})
|
||||||
radius: 5
|
});
|
||||||
}),
|
} else {
|
||||||
}
|
const __this = this;
|
||||||
)
|
const format = new GeoJSON();
|
||||||
}
|
const source = new VectorSource({
|
||||||
return this.styleCache[key];
|
strategy: loadingstrategy.bbox,
|
||||||
}
|
loader: function (extent: Extent, resolution: number, projection: Projection) {
|
||||||
});
|
const source = this as VectorSource<Feature<Geometry>>;
|
||||||
}
|
__this.itemService.getItemFeatures(item.code, extent, projection.getCode(), layerIndex).subscribe(function (data) {
|
||||||
} else if (itemLayer.item.itemType == 'vnd.farmmaps.itemtype.layer') {
|
const features = format.readFeatures(data).filter(feature => feature instanceof Feature) as Feature[];
|
||||||
let data = itemLayer.item.data as ILayerData;
|
for (const f of features) {
|
||||||
switch (data.interfaceType) {
|
if (f.get("code")) {
|
||||||
case 'OSM': {
|
f.setId(f.get("code"));
|
||||||
let source = new OSM();
|
}
|
||||||
layer = new Tile({ source: source });
|
}
|
||||||
break;
|
source.addFeatures(features);
|
||||||
}
|
});
|
||||||
case 'BingMaps': {
|
}
|
||||||
let source = new BingMaps(data.options);
|
});
|
||||||
layer = new Tile({ source: source });
|
layer = new VectorImageLayer({
|
||||||
break;
|
declutter: true,
|
||||||
}
|
source: source,
|
||||||
case 'TileWMS': {
|
style: (feature) => {
|
||||||
let source = new TileWMS(data.options);
|
const key =feature.get("code") + "_" + feature.get("color");
|
||||||
layer = new Tile({ source: source });
|
if (!this.styleCache[key]) {
|
||||||
break;
|
const color = feature.get("color");
|
||||||
}
|
this.styleCache[key] = new style.Style(
|
||||||
case 'TileArcGISRest': {
|
{
|
||||||
let source = new TileArcGISRest(data.options);
|
fill: new style.Fill({
|
||||||
layer = new Tile({ source: source });
|
color: color
|
||||||
break;
|
}),
|
||||||
}
|
stroke: new style.Stroke({
|
||||||
default: {
|
color: color,
|
||||||
break;
|
width: 1.25
|
||||||
}
|
}),
|
||||||
}
|
image: new style.Circle({
|
||||||
}
|
fill: new style.Fill({
|
||||||
if (layer) {
|
color: color
|
||||||
let geometry = new GeoJSON().readGeometry(itemLayer.item.geometry);
|
}),
|
||||||
let extent = geometry ? proj.transformExtent(geometry.getExtent(), 'EPSG:4326', 'EPSG:3857') : null;
|
stroke: new style.Stroke({
|
||||||
if (extent) layer.setExtent(extent);
|
color: color,
|
||||||
}
|
width: 1.25
|
||||||
|
}),
|
||||||
return layer;
|
radius: 5
|
||||||
}
|
}),
|
||||||
|
}
|
||||||
ngOnInit() {
|
)
|
||||||
super.ngOnInit();
|
}
|
||||||
this.updateLayers(this.itemLayers);
|
return this.styleCache[key];
|
||||||
}
|
}
|
||||||
|
});
|
||||||
updateLayers(itemLayers: IItemLayer[]) {
|
}
|
||||||
if (itemLayers) {
|
if(l.minzoom) {
|
||||||
var olLayers = this.instance.getLayers();
|
layer.setMinZoom(l.minzoom);
|
||||||
itemLayers.forEach((itemLayer, index) => {
|
}
|
||||||
|
if(l.maxzoom) {
|
||||||
var layer = itemLayer.layer;
|
layer.setMaxZoom(l.maxzoom);
|
||||||
let olIndex = olLayers.getArray().indexOf(layer);
|
}
|
||||||
if (olIndex < 0) {
|
return layer;
|
||||||
// New layer: we add it to the map
|
}
|
||||||
layer = this.createLayer(itemLayer);
|
|
||||||
if (layer) {
|
createSelectionLayer(itemLayer:IItemLayer):Layer<Source> {
|
||||||
itemLayer.layer = layer;
|
let layerIndex = -1;
|
||||||
}
|
const layer: Layer<Source> = null;
|
||||||
olLayers.insertAt(index, layer);
|
layerIndex = itemLayer.layerIndex != -1 ? itemLayer.layerIndex : itemLayer.item.data.layers[0].index;
|
||||||
} else if (index !== olIndex) {
|
const data = itemLayer.item.data;
|
||||||
// layer has moved inside the layers list
|
const l:ILayer = (data && data.layers && data.layers.length > 0) ? data.layers[layerIndex] : null;
|
||||||
olLayers.removeAt(olIndex);
|
if (l && l.rendering && l.rendering.renderoutputType == "VectorTiles") {
|
||||||
olLayers.insertAt(index, layer);
|
return new VectorTileLayer({
|
||||||
}
|
renderMode: 'vector',
|
||||||
layer.setOpacity(itemLayer.opacity);
|
source: (itemLayer.layer as VectorTileLayer).getSource(),
|
||||||
layer.setVisible(itemLayer.visible);
|
style: (feature) => {
|
||||||
});
|
if (feature.getId() in this.selectedFeatures) {
|
||||||
// Remove the layers that have disapeared from childrenLayers
|
|
||||||
if (olLayers.getLength() > itemLayers.length) {
|
return new style.Style(
|
||||||
for (let i = itemLayers.length; i < olLayers.getLength(); i++) {
|
{
|
||||||
olLayers.removeAt(i);
|
stroke: new style.Stroke({
|
||||||
}
|
color: '#0d6efd',
|
||||||
}
|
width: 3
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
|
);
|
||||||
ngOnChanges(changes: SimpleChanges) {
|
}
|
||||||
if (this.instance) {
|
},
|
||||||
if (changes['itemLayers']) {
|
minZoom: itemLayer.layer.getMinZoom(),
|
||||||
var itemLayers = changes['itemLayers'].currentValue as IItemLayer[];
|
maxZoom: itemLayer.layer.getMaxZoom()
|
||||||
this.updateLayers(itemLayers);
|
});
|
||||||
}
|
}
|
||||||
if (changes['itemLayer']) {
|
return null;
|
||||||
var itemLayer = changes['itemLayer'].currentValue as IItemLayer;
|
}
|
||||||
if(itemLayer) {
|
|
||||||
this.updateLayers([itemLayer]);
|
createExternalLayer(item:IItem,itemLayer:IItemLayer):Layer<Source> {
|
||||||
} else {
|
const data = item.data as ILayerData;
|
||||||
this.updateLayers([]);
|
let layer: Layer<Source> = null;
|
||||||
}
|
switch (data.interfaceType) {
|
||||||
}
|
case 'OSM': {
|
||||||
}
|
const source = new OSM();
|
||||||
}
|
layer = new Tile({ source: source });
|
||||||
}
|
break;
|
||||||
|
}
|
||||||
|
case 'BingMaps': {
|
||||||
|
const source = new BingMaps(data.options);
|
||||||
|
layer = new Tile({ source: source });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'TileWMS': {
|
||||||
|
const source = new TileWMS(data.options);
|
||||||
|
layer = new Tile({ source: source });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'TileJSON': {
|
||||||
|
const source = new TileJSON(data.options);
|
||||||
|
layer = new Tile({ source: source });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'TileArcGISRest': {
|
||||||
|
const source = new TileArcGISRest(data.options);
|
||||||
|
layer = new Tile({ source: source });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'VectorWFSJson': {
|
||||||
|
const source = new VectorSource({
|
||||||
|
format: new GeoJSON(),
|
||||||
|
url: function (extent) {
|
||||||
|
return (
|
||||||
|
data.options.url + '&srsname=' + data.projection +
|
||||||
|
'&bbox=' +
|
||||||
|
extent.join(',') +
|
||||||
|
',EPSG:3857'
|
||||||
|
);
|
||||||
|
},
|
||||||
|
strategy: loadingstrategy.bbox,
|
||||||
|
});
|
||||||
|
layer = new VectorLayer({ source: source });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return layer;
|
||||||
|
}
|
||||||
|
|
||||||
|
createLayer(itemLayer: IItemLayer): Layer<Source> {
|
||||||
|
let layer: Layer<Source> = null;
|
||||||
|
const layerIndex = -1;
|
||||||
|
if (itemLayer.item.itemType == 'vnd.farmmaps.itemtype.geotiff.processed') {
|
||||||
|
layer = this.createGeotiffLayer(itemLayer.item,itemLayer);
|
||||||
|
} else if (itemLayer.item.itemType == 'vnd.farmmaps.itemtype.shape.processed') {
|
||||||
|
layer = this.createShapeLayer(itemLayer.item,itemLayer);
|
||||||
|
} else if (itemLayer.item.itemType == 'vnd.farmmaps.itemtype.layer') {
|
||||||
|
layer = this.createExternalLayer(itemLayer.item,itemLayer);
|
||||||
|
}
|
||||||
|
if (layer) {
|
||||||
|
const geometry = new GeoJSON().readGeometry(itemLayer.item.geometry);
|
||||||
|
const extent = geometry ? proj.transformExtent(geometry.getExtent(), 'EPSG:4326', 'EPSG:3857') : null;
|
||||||
|
if (extent) layer.setExtent(extent);
|
||||||
|
}
|
||||||
|
|
||||||
|
return layer;
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
super.ngOnInit();
|
||||||
|
if(this.itemLayers) {
|
||||||
|
this.updateLayers(this.itemLayers);
|
||||||
|
} else if(this.itemLayer) {
|
||||||
|
if(this.getItemlayer(this.itemLayer).item.itemType == 'vnd.farmmaps.itemtype.shape.processed') {
|
||||||
|
this.installMapEventHandler();
|
||||||
|
}
|
||||||
|
this.updateLayers([this.itemLayer])
|
||||||
|
} else {
|
||||||
|
this.updateLayers([]);
|
||||||
|
}
|
||||||
|
this.initialized=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
const olLayers = this.instance.getLayers();
|
||||||
|
let layer = itemLayer.layer;
|
||||||
|
const olIndex = olLayers.getArray().indexOf(layer);
|
||||||
|
if (olIndex < 0) {
|
||||||
|
// New layer: we add it to the map
|
||||||
|
layer = this.createLayer(itemLayer);
|
||||||
|
if (layer) {
|
||||||
|
olLayers.insertAt(index, layer);
|
||||||
|
}
|
||||||
|
} else if (index !== olIndex) {
|
||||||
|
// layer has moved inside the layers list
|
||||||
|
olLayers.removeAt(olIndex);
|
||||||
|
olLayers.insertAt(index, layer);
|
||||||
|
}
|
||||||
|
if(layer) {
|
||||||
|
itemLayer.layer = layer;
|
||||||
|
layer.setOpacity(itemLayer.opacity);
|
||||||
|
layer.setVisible(itemLayer.visible);
|
||||||
|
}
|
||||||
|
return layer;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateLayers(itemLayers: IItemLayer[] | IItemLayer) {
|
||||||
|
this.unInstallTopLayerPrerenderEventhandler();
|
||||||
|
let dataLayer = false;
|
||||||
|
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') {
|
||||||
|
const il = itemLayer as ITemporalItemLayer;
|
||||||
|
const previousLayer = this.addOrUpdateOlLayer(il.previousItemLayer,newLayers.length);
|
||||||
|
if(previousLayer) newLayers.push(previousLayer);
|
||||||
|
const selectedLayer = this.addOrUpdateOlLayer(il.selectedItemLayer,newLayers.length);
|
||||||
|
if(selectedLayer) newLayers.push(selectedLayer);
|
||||||
|
const nextLayer = this.addOrUpdateOlLayer(il.nextItemLayer,newLayers.length);
|
||||||
|
if(nextLayer) newLayers.push(nextLayer);
|
||||||
|
this.installTopLayerPrerenderEventhandler(selectedLayer);
|
||||||
|
} else {
|
||||||
|
const layer = this.addOrUpdateOlLayer(itemLayer,newLayers.length);
|
||||||
|
if(layer) newLayers.push(layer);
|
||||||
|
this.installTopLayerPrerenderEventhandler(layer);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// Remove the layers that have disapeared from childrenLayers
|
||||||
|
const olLayers = this.instance.getLayers();
|
||||||
|
while(olLayers.getLength() > 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) {
|
||||||
|
if (this.instance && this.initialized) {
|
||||||
|
if (changes['itemLayers']) {
|
||||||
|
const itemLayers = changes['itemLayers'].currentValue as IItemLayer[];
|
||||||
|
this.updateLayers(itemLayers);
|
||||||
|
}
|
||||||
|
if (changes['itemLayer']) {
|
||||||
|
const itemLayer = changes['itemLayer'].currentValue as IItemLayer;
|
||||||
|
this.itemLayer = itemLayer
|
||||||
|
if(itemLayer) {
|
||||||
|
if(this.getItemlayer(this.itemLayer).item.itemType == 'vnd.farmmaps.itemtype.shape.processed') {
|
||||||
|
this.installMapEventHandler();
|
||||||
|
}
|
||||||
|
this.updateLayers([itemLayer]);
|
||||||
|
} else {
|
||||||
|
this.unInstallMapEventHandler();
|
||||||
|
this.updateLayers([]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnDestroy() {
|
||||||
|
this.unInstallMapEventHandler();
|
||||||
|
super.ngOnDestroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+260
-206
@@ -1,207 +1,261 @@
|
|||||||
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 * as style from 'ol/style';
|
import { Types } from 'ol/MapBrowserEventType';
|
||||||
import * as color from 'ol/color';
|
import * as style from 'ol/style';
|
||||||
import * as loadingstrategy from 'ol/loadingstrategy';
|
import * as color from 'ol/color';
|
||||||
import * as condition from 'ol/events/condition';
|
import * as loadingstrategy from 'ol/loadingstrategy';
|
||||||
import * as extent from 'ol/extent';
|
import * as condition from 'ol/events/condition';
|
||||||
import {Vector,Cluster} from 'ol/source';
|
import * as extent from 'ol/extent';
|
||||||
import {Layer} from 'ol/layer';
|
import { Vector, Cluster, Source } from 'ol/source';
|
||||||
import {GeoJSON} from 'ol/format';
|
import { Layer } from 'ol/layer';
|
||||||
import {Select} from 'ol/interaction';
|
import { GeoJSON } from 'ol/format';
|
||||||
|
import { Select } from 'ol/interaction';
|
||||||
|
import { IStyles } from '../../../models/style.cache';
|
||||||
|
import { FeatureIconService } from '../../../services/feature-icon.service';
|
||||||
|
import { Subscription } from 'rxjs';
|
||||||
|
import { getCenter } from 'ol/extent';
|
||||||
|
import { formatNumber } from '@angular/common';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'fm-map-item-source-vector',
|
selector: 'fm-map-item-source-vector',
|
||||||
template: `<ng-content></ng-content>`,
|
template: `<ng-content></ng-content>`,
|
||||||
providers: [
|
providers: [
|
||||||
{ provide: SourceVectorComponent , useExisting: forwardRef(() => ItemVectorSourceComponent) }
|
{ provide: SourceVectorComponent, useExisting: forwardRef(() => ItemVectorSourceComponent) }
|
||||||
]
|
],
|
||||||
})
|
standalone: false
|
||||||
export class ItemVectorSourceComponent extends SourceVectorComponent implements OnInit, OnChanges {
|
})
|
||||||
instance: Vector;
|
export class ItemVectorSourceComponent extends SourceVectorComponent implements OnInit, OnDestroy, OnChanges {
|
||||||
private _format: GeoJSON;
|
instance: Vector<Feature<Geometry>>;
|
||||||
private _select: Select;
|
private _format: GeoJSON;
|
||||||
private _hoverSelect: Select;
|
private _select: Select;
|
||||||
private _iconScale: number = 0.05;
|
private _hoverSelect: Select;
|
||||||
@Input() features: Array<Feature>;
|
private _iconScale = 0.05;
|
||||||
@Input() selectedFeature: Feature;
|
@Input() features: Array<Feature<Geometry>>;
|
||||||
@Input() selectedItem: IItem;
|
@Input() selectedFeature: Feature<Geometry>;
|
||||||
@Output() onFeaturesSelected: EventEmitter<Feature> = new EventEmitter<Feature>();
|
@Input() selectedItem: IItem;
|
||||||
private styleCache = {
|
@Input() styles: IStyles;
|
||||||
'file': new style.Style({
|
@Output() onFeatureSelected: EventEmitter<Feature<Geometry>> = new EventEmitter<Feature<Geometry>>();
|
||||||
image: new style.Icon({
|
@Output() onFeatureHover: EventEmitter<Feature<Geometry>> = new EventEmitter<Feature<Geometry>>();
|
||||||
anchor: [0.5, 1],
|
private stylesCache: IStyles = {};
|
||||||
scale: 0.05,
|
private sub: Subscription;
|
||||||
src: this.getIconImageDataUrl("fa fa-file-o")
|
private displayMapFeatureSettings: { [code: string]: string[] } = defaultDisplayMapFeatureSettings();
|
||||||
}),
|
|
||||||
stroke: new style.Stroke({
|
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) {
|
||||||
color: 'red',
|
super(layer);
|
||||||
width: 1
|
this._format = new GeoJSON();
|
||||||
}),
|
}
|
||||||
fill: new style.Fill({
|
|
||||||
color: 'rgba(0, 0, 255, 0.1)'
|
geometry(feature: Feature<Geometry>) {
|
||||||
}),
|
const view = this.map.instance.getView();
|
||||||
geometry: (feature) => this.geometry(feature)
|
const resolution = view.getResolution();
|
||||||
}),
|
let geometry = feature.getGeometry();
|
||||||
'selected': new style.Style({
|
const e = geometry.getExtent();
|
||||||
image: new style.Icon({
|
//var size = Math.max((e[2] - e[0]) / resolution, (e[3] - e[1]) / resolution);
|
||||||
anchor: [0.5, 1],
|
if (resolution > 12) {
|
||||||
scale: 0.08,
|
geometry = new Point(extent.getCenter(e));
|
||||||
src: this.getIconImageDataUrl(null)
|
}
|
||||||
}),
|
return geometry;
|
||||||
stroke: new style.Stroke({
|
}
|
||||||
color: 'red',
|
|
||||||
width: 3
|
getSelectedStyle(feature: Feature<Geometry>): style.Style {
|
||||||
}),
|
const key = feature.get('itemType') + "_selected";
|
||||||
fill: new style.Fill({
|
let evaluatedStyle: style.Style = undefined;
|
||||||
color: 'rgba(0, 0, 255, 0.1)'
|
const styleEntry = this.stylesCache[key];
|
||||||
}),
|
if (styleEntry) {
|
||||||
geometry: (feature) => this.geometry(feature)
|
if (typeof styleEntry === 'function') {
|
||||||
})
|
evaluatedStyle = styleEntry(feature);
|
||||||
};
|
} else {
|
||||||
|
evaluatedStyle = styleEntry;
|
||||||
constructor(@Host() private layer: LayerVectorComponent, private itemService: ItemService, @Host() private map: MapComponent, private itemTypeService: ItemTypeService) {
|
}
|
||||||
super(layer);
|
} else {
|
||||||
this._format = new GeoJSON();
|
evaluatedStyle = this.stylesCache["selected"] as style.Style;
|
||||||
}
|
}
|
||||||
|
if (evaluatedStyle) {
|
||||||
geometry(feature: Feature) {
|
evaluatedStyle.setGeometry((feature: Feature<Geometry>) => this.geometry(feature));
|
||||||
let view = this.map.instance.getView();
|
}
|
||||||
let resolution = view.getResolution();
|
return evaluatedStyle as style.Style
|
||||||
var geometry = feature.getGeometry();
|
}
|
||||||
let e = geometry.getExtent();
|
|
||||||
//var size = Math.max((e[2] - e[0]) / resolution, (e[3] - e[1]) / resolution);
|
ngOnInit() {
|
||||||
if (resolution > 12) {
|
this.sub = this.folderService.getFolder('my_settings').subscribe(
|
||||||
geometry = new Point(extent.getCenter(e));
|
userSettingsRoot => {
|
||||||
}
|
if (userSettingsRoot == undefined) return;
|
||||||
return geometry;
|
this.itemService.getChildItemList(userSettingsRoot.code, 'vnd.farmmaps.itemtype.settings.general').subscribe(
|
||||||
}
|
items => {
|
||||||
|
if (items && items.length > 0 && items[0].data?.displayMapFeatureSettings) {
|
||||||
getIconImageDataUrl(iconClass:string, backgroundColor: string = "#c80a6e",color:string = "#ffffff"): string {
|
this.displayMapFeatureSettings = items[0].data?.displayMapFeatureSettings;
|
||||||
var canvas = document.createElement('canvas');
|
}
|
||||||
canvas.width = 365;
|
}
|
||||||
canvas.height = 560;
|
)
|
||||||
var ctx = canvas.getContext('2d');
|
}
|
||||||
ctx.lineWidth = 6;
|
);
|
||||||
ctx.fillStyle = backgroundColor;
|
this.strategy = loadingstrategy.bbox;
|
||||||
ctx.strokeStyle = "#000000";
|
this.format = new GeoJSON();
|
||||||
var path = new Path2D("m182.9 551.7c0 0.1 0.2 0.3 0.2 0.3s175.2-269 175.2-357.4c0-130.1-88.8-186.7-175.4-186.9-86.6 0.2-175.4 56.8-175.4 186.9 0 88.4 175.3 357.4 175.3 357.4z");
|
this._select = new Select({
|
||||||
ctx.fill(path)
|
style: null,
|
||||||
|
hitTolerance: 10,
|
||||||
var iconCharacter = "";
|
layers: [this.layer.instance as Layer<Source>]
|
||||||
if (iconClass != null) {
|
});
|
||||||
var element = document.createElement("i");
|
this._hoverSelect = new Select({
|
||||||
element.style.display = "none";
|
style: (feature: Feature<Geometry>) => {
|
||||||
element.className = iconClass;
|
return this.getSelectedStyle(feature);
|
||||||
document.body.appendChild(element);
|
},
|
||||||
iconCharacter = getComputedStyle(element, "::before").content.replace(/"/g, '');
|
hitTolerance: 10,
|
||||||
let iconFont = "200px " +getComputedStyle(element, "::before").fontFamily
|
condition: (e: MapBrowserEvent<UIEvent>) => {
|
||||||
document.body.removeChild(element);
|
return e.type == 'pointermove';
|
||||||
ctx.strokeStyle = color;
|
},
|
||||||
ctx.fillStyle = color;
|
layers: [this.layer.instance as Layer<Source>]
|
||||||
ctx.lineWidth = 15;
|
});
|
||||||
ctx.font = iconFont;
|
this.map.instance.addInteraction(this._select);
|
||||||
var ts = ctx.measureText(iconCharacter);
|
this.map.instance.addInteraction(this._hoverSelect);
|
||||||
ctx.fillText(iconCharacter, 182.9 - (ts.width / 2), 250);
|
this._select.on('select', (e) => {
|
||||||
ctx.strokeText(iconCharacter, 182.9 - (ts.width / 2), 250);
|
if (e.selected.length > 0 && e.selected[0]) {
|
||||||
}
|
this.onFeatureSelected.emit(e.selected[0]);
|
||||||
|
} else {
|
||||||
return canvas.toDataURL();
|
this.onFeatureSelected.emit(null);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
ngOnInit() {
|
this._hoverSelect.on('select', (e) => {
|
||||||
this.strategy = loadingstrategy.bbox;
|
if (e.selected.length > 0 && e.selected[0]) {
|
||||||
this.format = new GeoJSON();
|
this.onFeatureHover.emit(e.selected[0]);
|
||||||
this._select = new Select({
|
} else {
|
||||||
style: (feature) => {
|
this.onFeatureHover.emit(null);
|
||||||
return this.styleCache['selected'];
|
}
|
||||||
},
|
});
|
||||||
hitTolerance: 10,
|
this.instance = new Vector(this);
|
||||||
layers: [this.layer.instance as Layer]
|
this.host.instance.setSource(this.instance);
|
||||||
});
|
|
||||||
this._hoverSelect = new Select({
|
this.host.instance.setStyle((feature) => {
|
||||||
style: (feature) => {
|
const itemType = feature.get('itemType');
|
||||||
return this.styleCache['selected'];
|
let key = itemType + (this.selectedItem ? "_I" : "");
|
||||||
},
|
if (!this.stylesCache[key]) {
|
||||||
hitTolerance: 10,
|
if (this.itemTypeService.itemTypes[itemType]) {
|
||||||
condition: (e: MapBrowserEvent) => {
|
const itemTypeEntry = this.itemTypeService.itemTypes[itemType];
|
||||||
return e.type == 'pointermove';
|
const fillColor = color.asArray(itemTypeEntry.iconColor);
|
||||||
},
|
fillColor[3] = 0;
|
||||||
layers: [this.layer.instance as Layer]
|
this.stylesCache[key] = new style.Style({
|
||||||
});
|
image: itemTypeEntry.icon ? new style.Icon({
|
||||||
this.map.instance.addInteraction(this._select);
|
anchor: [0.5, 1],
|
||||||
this.map.instance.addInteraction(this._hoverSelect);
|
scale: 0.05,
|
||||||
this._select.on('select', (e) => {
|
src: this.featureIconService$.getIconImageDataUrl(itemTypeEntry.icon)
|
||||||
if (e.selected.length > 0 && e.selected[0]) {
|
}) : null,
|
||||||
this.onFeaturesSelected.emit(e.selected[0]);
|
stroke: new style.Stroke({
|
||||||
} else {
|
color: 'red',
|
||||||
this.onFeaturesSelected.emit(null);
|
width: 1
|
||||||
}
|
}),
|
||||||
});
|
fill: new style.Fill({
|
||||||
this.instance = new Vector(this);
|
color: fillColor
|
||||||
this.host.instance.setSource(this.instance);
|
}),
|
||||||
|
geometry: (feature: Feature<Geometry>) => this.geometry(feature),
|
||||||
this.host.instance.setStyle((feature) => {
|
text: this.getDisplayTextForFeature(feature, this.map.instance.getView().getZoom())
|
||||||
var key = feature.get('itemType') + (this.selectedItem?"_I":"");
|
});
|
||||||
if (!this.styleCache[key]) {
|
} else {
|
||||||
if (this.itemTypeService.itemTypes[key]) {
|
key = 'file';
|
||||||
let itemType = this.itemTypeService.itemTypes[key];
|
}
|
||||||
let fillColor = color.asArray(itemType.iconColor);
|
}
|
||||||
fillColor[3] = this.selectedItem?0:0.5;
|
let evaluatedStyle = null;
|
||||||
this.styleCache[key] = new style.Style({
|
const styleEntry = this.stylesCache[key];
|
||||||
image: itemType.icon ? new style.Icon({
|
if (typeof styleEntry === 'function') {
|
||||||
anchor: [0.5, 1],
|
evaluatedStyle = styleEntry(feature);
|
||||||
scale: 0.05,
|
} else {
|
||||||
src: this.getIconImageDataUrl(itemType.icon)
|
evaluatedStyle = styleEntry;
|
||||||
}):null,
|
}
|
||||||
stroke: new style.Stroke({
|
if (evaluatedStyle && evaluatedStyle.geometry_ == null && !Array.isArray(evaluatedStyle)) {
|
||||||
color: 'red',
|
evaluatedStyle.setGeometry((feature) => this.geometry(feature));
|
||||||
width: 1
|
}
|
||||||
}),
|
return evaluatedStyle;
|
||||||
fill: new style.Fill({
|
});
|
||||||
color: fillColor
|
}
|
||||||
}),
|
|
||||||
geometry: (feature) => this.geometry(feature)
|
ngOnDestroy(): void {
|
||||||
});
|
if (this.sub) this.sub.unsubscribe();
|
||||||
} else {
|
}
|
||||||
key = 'file';
|
|
||||||
}
|
ngOnChanges(changes: SimpleChanges) {
|
||||||
}
|
if (changes["features"] && this.instance) {
|
||||||
var styleEntry = this.styleCache[key];
|
this.instance.clear(true);
|
||||||
return styleEntry;
|
this._select.getFeatures().clear();
|
||||||
});
|
this.instance.addFeatures(changes["features"].currentValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnChanges(changes: SimpleChanges) {
|
if (changes["selectedFeature"] && this.instance) {
|
||||||
if (changes["features"] && this.instance) {
|
const features = this._hoverSelect.getFeatures();
|
||||||
this.instance.clear(true);
|
const feature = changes["selectedFeature"].currentValue
|
||||||
this._select.getFeatures().clear();
|
//this.instance.clear(false);
|
||||||
this.instance.addFeatures(changes["features"].currentValue);
|
//this.instance.addFeatures(features.getArray());
|
||||||
}
|
features.clear();
|
||||||
|
if (feature) {
|
||||||
if (changes["selectedFeature"] && this.instance) {
|
//this.instance.removeFeature(feature);
|
||||||
var features = this._select.getFeatures();
|
features.push(feature)
|
||||||
var feature = changes["selectedFeature"].currentValue
|
}
|
||||||
//this.instance.clear(false);
|
}
|
||||||
//this.instance.addFeatures(features.getArray());
|
if (changes["selectedItem"] && this.instance) {
|
||||||
features.clear();
|
const item = changes["selectedItem"].currentValue
|
||||||
if (feature) {
|
if (item) {
|
||||||
//this.instance.removeFeature(feature);
|
this.map.instance.removeInteraction(this._hoverSelect);
|
||||||
features.push(feature)
|
} else {
|
||||||
}
|
this.map.instance.addInteraction(this._hoverSelect);
|
||||||
}
|
}
|
||||||
if (changes["selectedItem"] && this.instance) {
|
}
|
||||||
var item = changes["selectedItem"].currentValue
|
if (changes["styles"]) {
|
||||||
if (item) {
|
const styles = changes["styles"].currentValue;
|
||||||
this.map.instance.removeInteraction(this._hoverSelect);
|
for (const key in styles) {
|
||||||
} else {
|
if (styles.hasOwnProperty(key)) {
|
||||||
this.map.instance.addInteraction(this._hoverSelect);
|
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']
|
||||||
|
};
|
||||||
|
}
|
||||||
+47
-26
@@ -1,29 +1,50 @@
|
|||||||
<div class="layerlist" *ngIf="itemLayers.length > 0;else noLayers">
|
<div>
|
||||||
<div class="list-group">
|
@if (itemLayers.length > 0) {
|
||||||
<div *ngFor="let itemLayer of itemLayers" class="list-group-item list-group-item-action p-2 text-truncate" [ngClass]="{'active' : selectedLayer==itemLayer}">
|
<div class="layerlist">
|
||||||
<div (click)="handleSelectLayer($event,itemLayer)" [title]="itemLayer.item.name">{{itemLayer.item.name}}</div>
|
<div class="list-group">
|
||||||
<div class="mt-1" *ngIf="selectedLayer==itemLayer && !baseLayers">
|
@for (itemLayer of itemLayers; track itemLayer) {
|
||||||
<span class="btn-group">
|
<div class="list-group-item list-group-item-action p-2 text-truncate" [ngClass]="{'active' : selectedLayer==itemLayer}">
|
||||||
<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>
|
<div (click)="handleSelectLayer($event,itemLayer)" [title]="itemLayer.item.name">{{itemLayer.item.name}}</div>
|
||||||
<a title="Transparency 25%" *ngIf="itemLayer.visible" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.25)">25%</a>
|
@if (selectedLayer==itemLayer && !baseLayers) {
|
||||||
<a title="Transparency 50%" *ngIf="itemLayer.visible" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.5)">50%</a>
|
<div class="mt-1">
|
||||||
<a title="Transparency 75%" *ngIf="itemLayer.visible" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.75)">75%</a>
|
<span class="btn-group">
|
||||||
<a title="No transparency" *ngIf="itemLayer.visible" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,1)">100%</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>
|
||||||
</span>
|
@if (itemLayer.visible) {
|
||||||
<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>
|
<a title="Transparency 25%" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.25)">25%</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>
|
}
|
||||||
<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>
|
@if (itemLayer.visible) {
|
||||||
</div>
|
<a title="Transparency 50%" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.5)">50%</a>
|
||||||
<div *ngIf="itemLayer.legendVisible">
|
}
|
||||||
<div class="card legend">
|
@if (itemLayer.visible) {
|
||||||
<fm-map-layer-legend [layer]="firstLayer(itemLayer)" (click)="handleLegendClick($event,itemLayer);"></fm-map-layer-legend>
|
<a title="Transparency 75%" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.75)">75%</a>
|
||||||
|
}
|
||||||
|
@if (itemLayer.visible) {
|
||||||
|
<a title="No transparency" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,1)">100%</a>
|
||||||
|
}
|
||||||
|
</span>
|
||||||
|
<a href="#" title="Zoom to extent" class="btn btn-light btn-sm" (click)="handleZoomToExtent($event,itemLayer)"><i class="far fa-search-plus" aria-hidden="true"></i></a>
|
||||||
|
@if (firstLayer(itemLayer)) {
|
||||||
|
<span><a href="#" title="Toggle legend" class="btn btn-light btn-sm" (click)="itemLayer.legendVisible=toggleLegend($event,itemLayer.legendVisible)"><i class="far fa-chart-bar" aria-hidden="true"></i></a></span>
|
||||||
|
}
|
||||||
|
@if (!dataLayers) {
|
||||||
|
<span class="float-end"><a href="#" title="Remove overlay" class="btn btn-light btn-sm" (click)="handleDelete($event,itemLayer)"><i class="fas fa-layer-minus" aria-hidden="true"></i></a></span>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
@if (itemLayer.legendVisible) {
|
||||||
|
<div>
|
||||||
|
<div class="card legend">
|
||||||
|
<fm-map-layer-legend [layer]="firstLayer(itemLayer)" (click)="handleLegendClick($event,itemLayer);" [histogramenabled]="true"></fm-map-layer-legend>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
} @else {
|
||||||
|
<div class="list-group">
|
||||||
|
<div class="list-group-item" i18n>No layers</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
<ng-template #noLayers>
|
|
||||||
<div class="list-group">
|
|
||||||
<div class="list-group-item" i18n>No layers</div>
|
|
||||||
</div>
|
|
||||||
</ng-template>
|
|
||||||
|
|||||||
@@ -1,64 +1,66 @@
|
|||||||
import { Component,Input,Output,EventEmitter } from '@angular/core';
|
import { Component,Input,Output,EventEmitter } from '@angular/core';
|
||||||
import { IItemLayer } from '../../../models';
|
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 {
|
|
||||||
@Input() itemLayers: IItemLayer[];
|
export class LayerListComponent {
|
||||||
@Input() baseLayers: boolean = false;
|
@Input() itemLayers: IItemLayer[] = [];
|
||||||
@Output() onToggleVisibility = new EventEmitter<IItemLayer>();
|
@Input() baseLayers = false;
|
||||||
@Output() onSetOpacity = new EventEmitter<{layer: IItemLayer,opacity:number }>();
|
@Input() dataLayers = false;
|
||||||
@Output() onDelete = new EventEmitter<IItemLayer>();
|
@Output() onToggleVisibility = new EventEmitter<IItemLayer>();
|
||||||
@Output() onZoomToExtent = new EventEmitter<IItemLayer>();
|
@Output() onSetOpacity = new EventEmitter<{layer: IItemLayer,opacity:number }>();
|
||||||
@Output() onSelectLayer = new EventEmitter<IItemLayer>();
|
@Output() onDelete = new EventEmitter<IItemLayer>();
|
||||||
@Input() selectedLayer: IItemLayer;
|
@Output() onZoomToExtent = new EventEmitter<IItemLayer>();
|
||||||
|
@Output() onSelectLayer = new EventEmitter<IItemLayer>();
|
||||||
constructor( ) {
|
@Input() selectedLayer: IItemLayer;
|
||||||
}
|
|
||||||
|
constructor( ) {
|
||||||
handleDelete(event:MouseEvent, item:IItemLayer) {
|
}
|
||||||
this.onDelete.emit(item);
|
|
||||||
event.preventDefault();
|
handleDelete(event:MouseEvent, item:IItemLayer) {
|
||||||
}
|
this.onDelete.emit(item);
|
||||||
|
event.preventDefault();
|
||||||
handleToggleVisibility(event:MouseEvent, item: IItemLayer) {
|
}
|
||||||
this.onToggleVisibility.emit(item);
|
|
||||||
item.legendVisible = item.visible && item.legendVisible;
|
handleToggleVisibility(event:MouseEvent, item: IItemLayer) {
|
||||||
event.preventDefault();
|
this.onToggleVisibility.emit(item);
|
||||||
}
|
item.legendVisible = item.visible && item.legendVisible;
|
||||||
|
event.preventDefault();
|
||||||
handleSetOpacity(event: MouseEvent, layer: IItemLayer,opacity:number) {
|
}
|
||||||
this.onSetOpacity.emit({ layer,opacity });
|
|
||||||
event.preventDefault();
|
handleSetOpacity(event: MouseEvent, layer: IItemLayer,opacity:number) {
|
||||||
}
|
this.onSetOpacity.emit({ layer,opacity });
|
||||||
|
event.preventDefault();
|
||||||
handleZoomToExtent(event: MouseEvent, item: IItemLayer) {
|
}
|
||||||
this.onZoomToExtent.emit(item);
|
|
||||||
event.preventDefault();
|
handleZoomToExtent(event: MouseEvent, item: IItemLayer) {
|
||||||
}
|
this.onZoomToExtent.emit(item);
|
||||||
|
event.preventDefault();
|
||||||
handleSelectLayer(event: MouseEvent, item: IItemLayer) {
|
}
|
||||||
this.onSelectLayer.emit(item);
|
|
||||||
event.preventDefault();
|
handleSelectLayer(event: MouseEvent, item: IItemLayer) {
|
||||||
}
|
this.onSelectLayer.emit(item);
|
||||||
|
event.preventDefault();
|
||||||
firstLayer(item: IItemLayer): any {
|
}
|
||||||
if (item && item.item && item.item.data && item.item.data.layers && item.item.data.layers.length > 0) return item.item.data.layers[0];
|
|
||||||
return null;
|
firstLayer(item: IItemLayer): any {
|
||||||
}
|
if (item && item.item && item.item.data && item.item.data.layers && item.item.data.layers.length > 0) return item.item.data.layers[0];
|
||||||
|
return null;
|
||||||
toggleLegend(event: MouseEvent, lg: boolean) {
|
}
|
||||||
event.preventDefault();
|
|
||||||
return !lg;
|
toggleLegend(event: MouseEvent, lg: boolean) {
|
||||||
}
|
event.preventDefault();
|
||||||
|
return !lg;
|
||||||
handleLegendClick(event: MouseEvent, item: IItemLayer) {
|
}
|
||||||
this.onSelectLayer.emit(item);
|
|
||||||
this.onZoomToExtent.emit(item);
|
handleLegendClick(event: MouseEvent, item: IItemLayer) {
|
||||||
event.preventDefault();
|
this.onSelectLayer.emit(item);
|
||||||
}
|
this.onZoomToExtent.emit(item);
|
||||||
}
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+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 layerValue) {
|
||||||
|
<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;
|
||||||
|
}
|
||||||
|
|
||||||
+25
@@ -0,0 +1,25 @@
|
|||||||
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { LayerValuesComponent } from './layer-values.component';
|
||||||
|
|
||||||
|
describe('LayerValuesComponent', () => {
|
||||||
|
let component: LayerValuesComponent;
|
||||||
|
let fixture: ComponentFixture<LayerValuesComponent>;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await TestBed.configureTestingModule({
|
||||||
|
declarations: [ LayerValuesComponent ]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(LayerValuesComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -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);
|
||||||
|
|||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
<div (click)="handleClick($event)" class="btn btn-outline-primary gps-location">
|
||||||
|
<svg height="100%" width="100%" viewBox="0 0 96 96">
|
||||||
|
<g
|
||||||
|
id="XMLID_1_"><circle
|
||||||
|
class="pan-to" [ngClass]="{'pan-to-centered':centered(),'pan-to-disabled':disabled()}"
|
||||||
|
cx="48"
|
||||||
|
cy="48"
|
||||||
|
r="9.8000002"/><path
|
||||||
|
class="pan-to" [ngClass]="{'pan-to-centered':centered(),'pan-to-disabled':disabled()}"
|
||||||
|
d="M 80.5,44.8 H 73.8 C 72.3,33 63,23.7 51.3,22.2 v -6.7 h -6.5 v 6.7 C 33,23.7 23.7,33 22.2,44.8 h -6.7 v 6.5 h 6.7 C 23.7,63 33,72.3 44.8,73.8 v 6.7 h 6.5 V 73.8 C 63,72.3 72.3,63 73.8,51.3 h 6.7 z M 48,67.5 C 37.2,67.5 28.5,58.8 28.5,48 28.5,37.2 37.2,28.5 48,28.5 c 10.8,0 19.5,8.7 19.5,19.5 0,10.8 -8.7,19.5 -19.5,19.5 z"
|
||||||
|
inkscape:connector-curvature="0"/></g>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
.gps-location {
|
||||||
|
display:block;
|
||||||
|
width:2.5em;
|
||||||
|
height:2.5em;
|
||||||
|
background-color: var(--bs-body-bg);
|
||||||
|
background-size: contain;
|
||||||
|
margin-top:0.5em;
|
||||||
|
border-radius: 1.75em;
|
||||||
|
padding:0
|
||||||
|
}
|
||||||
|
|
||||||
|
.center, .tolerance, .border {
|
||||||
|
stroke-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pan-to {
|
||||||
|
fill: var(--bs-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
div.gps-location:hover .pan-to {
|
||||||
|
fill: var(--bs-white);
|
||||||
|
}
|
||||||
|
|
||||||
|
.pan-to-centered {
|
||||||
|
fill: var(--bs-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
div.gps-location:hover .pan-to-centered {
|
||||||
|
fill: theme-color-level(primary, -10)
|
||||||
|
}
|
||||||
|
|
||||||
|
.pan-to.pan-to-disabled {
|
||||||
|
fill: var(--bs-gray-300);
|
||||||
|
}
|
||||||
+85
@@ -0,0 +1,85 @@
|
|||||||
|
import { Component, OnInit, Input, Host, OnChanges, SimpleChanges,ChangeDetectorRef } from '@angular/core';
|
||||||
|
import { MapComponent } from '@farmmaps/ng-openlayers';
|
||||||
|
import {IMapState} from '../../../models/map.state'
|
||||||
|
import {View} from 'ol';
|
||||||
|
import { fromLonLat } from 'ol/proj';
|
||||||
|
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'fm-map-pan-to-location',
|
||||||
|
templateUrl: './pan-to-location.component.html',
|
||||||
|
styleUrls: ['./pan-to-location.component.scss'],
|
||||||
|
standalone: false
|
||||||
|
})
|
||||||
|
export class PanToLocation implements OnInit,OnChanges{
|
||||||
|
|
||||||
|
view: View;
|
||||||
|
map: MapComponent;
|
||||||
|
@Input() position: GeolocationPosition;
|
||||||
|
@Input() mapState: IMapState;
|
||||||
|
@Input() animate: boolean;
|
||||||
|
|
||||||
|
constructor(@Host() map: MapComponent,private changeDetectorRef$: ChangeDetectorRef ) {
|
||||||
|
this.map = map;
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
this.view = this.map.instance.getView();
|
||||||
|
this.view.on('change:center', () => {
|
||||||
|
this.changeDetectorRef$.detectChanges();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnChanges(changes: SimpleChanges) {
|
||||||
|
// if (changes.position && this.instance) {
|
||||||
|
// var p = changes.position.currentValue as Position;
|
||||||
|
// this.instance.setPosition(fromLonLat([p.coords.longitude, p.coords.latitude]));
|
||||||
|
// this.locationTolerance = p.coords.accuracy;
|
||||||
|
// this.recalcLocationTolerance();
|
||||||
|
// this.heading = p.coords.heading;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
p
|
||||||
|
|
||||||
|
public centered():boolean {
|
||||||
|
if(this.position && this.mapState) {
|
||||||
|
const center = this.view.getCenter();
|
||||||
|
const newCenter = fromLonLat([this.position.coords.longitude,this.position.coords.latitude]);
|
||||||
|
const x1 = newCenter[0].toFixed(0);
|
||||||
|
const x2 = center[0].toFixed(0);
|
||||||
|
const y1 = newCenter[1].toFixed(0);
|
||||||
|
const y2 = center[1].toFixed(0);
|
||||||
|
return x1==x2 && y1==y2;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public disabled():boolean {
|
||||||
|
return !this.position;
|
||||||
|
}
|
||||||
|
|
||||||
|
handleClick(event:Event) {
|
||||||
|
if(this.position) {
|
||||||
|
const view = this.map.instance.getView();
|
||||||
|
const newCenter = fromLonLat([this.position.coords.longitude,this.position.coords.latitude]);
|
||||||
|
const extent = [newCenter[0]-500,newCenter[1]-500,newCenter[0]+500,newCenter[1]+500];
|
||||||
|
const options = { padding: [0, 0, 0, 0],minResolution:1 };
|
||||||
|
const size = this.map.instance.getSize();
|
||||||
|
const rem = parseFloat(getComputedStyle(document.documentElement).fontSize);
|
||||||
|
const threshold = 44 * rem;
|
||||||
|
let left = 1 * rem;
|
||||||
|
const right = 1 * rem;
|
||||||
|
let bottom = Math.round(size[1] / 2);
|
||||||
|
const top = 1 * rem;
|
||||||
|
if (size[0] > threshold) {
|
||||||
|
bottom = 1 * rem;
|
||||||
|
left = 23 * rem;
|
||||||
|
}
|
||||||
|
//options.padding = [top, right, bottom, left];
|
||||||
|
if (this.animate) options["duration"] = 2000;
|
||||||
|
view.fit(extent, options);
|
||||||
|
}
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
}
|
||||||
+35
@@ -0,0 +1,35 @@
|
|||||||
|
<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">
|
||||||
|
<g
|
||||||
|
inkscape:label="Laag 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-164.70832)">
|
||||||
|
<g
|
||||||
|
id="g4550"
|
||||||
|
transform="translate(2.3213753,-1.8555167)">
|
||||||
|
<path
|
||||||
|
id="top-r"
|
||||||
|
d="m 63.824458,179.82737 v 52.8823 H 48.380953 Z"
|
||||||
|
style="stroke:none;stroke-width:0.15389842px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
id="top-l"
|
||||||
|
d="m 63.824458,179.82737 v 52.8823 h 15.443505 z"
|
||||||
|
style="stroke:none;stroke-width:0.15389842px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
id="bottom-l"
|
||||||
|
d="m 63.824458,285.59197 v -52.8823 h -15.4435 z"
|
||||||
|
style="stroke:none;stroke-width:0.15389842px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
id="bottom-r"
|
||||||
|
d="m 63.824458,285.59197 v -52.8823 h 15.443505 z"
|
||||||
|
style="stroke:none;stroke-width:0.15389842px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
|
||||||
|
<path
|
||||||
|
id="north"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:2.95481014"
|
||||||
|
d="m 50.702335,239.32724 h 9.926315 l 12.534859,23.63848 v -23.63848 h 8.425825 v 34.46509 H 71.663019 L 59.12816,250.15385 v 23.63848 h -8.425825 z" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
+66
@@ -0,0 +1,66 @@
|
|||||||
|
.compass {
|
||||||
|
width:2.5em;
|
||||||
|
height:2.5em;
|
||||||
|
background-color: white;
|
||||||
|
opacity: 1;
|
||||||
|
border-radius:1.75em;
|
||||||
|
padding:0;
|
||||||
|
margin-top:0.5em;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
#north {
|
||||||
|
display: none;
|
||||||
|
fill:var(--bs-black);
|
||||||
|
}
|
||||||
|
|
||||||
|
#top-l {
|
||||||
|
fill:#d40000;
|
||||||
|
}
|
||||||
|
|
||||||
|
#top-r {
|
||||||
|
fill:#ff0000;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bottom-l {
|
||||||
|
fill:#000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bottom-r {
|
||||||
|
fill:#666666;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.compass:hover #top-l {
|
||||||
|
fill:var(--bs-white);
|
||||||
|
}
|
||||||
|
|
||||||
|
div.compass:hover #top-r {
|
||||||
|
fill:var(--bs-gray-300);
|
||||||
|
}
|
||||||
|
|
||||||
|
div.compass:hover #bottom-l {
|
||||||
|
fill:var(--bs-gray-300);
|
||||||
|
}
|
||||||
|
|
||||||
|
div.compass:hover #bottom-r {
|
||||||
|
fill:var(--bs-white);
|
||||||
|
}
|
||||||
|
|
||||||
|
div.compass:hover #north {
|
||||||
|
fill:var(--bs-white);
|
||||||
|
}
|
||||||
|
|
||||||
|
.compass-n {
|
||||||
|
transition: opacity 1s ease-out 2s,height 1s ease-out 3s,margin-top 1s ease-out 3s;
|
||||||
|
opacity:0;
|
||||||
|
height:0;
|
||||||
|
margin-top:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.compass-n #bottom-l, .compass-n #bottom-r {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.compass-n #north {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
+39
-52
@@ -1,53 +1,40 @@
|
|||||||
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',
|
||||||
template: `<div (click)="handleClick($event)" class="rounded-circle compass" [style.transform]="Rotation()" [ngClass]="{'compass-n':IsNorth()}"></div>`,
|
templateUrl: './rotation-reset.component.html',
|
||||||
styles: [`.compass {
|
styleUrls: ['./rotation-reset.component.scss'],
|
||||||
width:2.5em;
|
standalone: false
|
||||||
height:2.5em;
|
})
|
||||||
background-color: white;
|
export class RotationResetComponent implements OnInit {
|
||||||
background-size: contain;
|
view: View;
|
||||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAF6AAABegB0iYb4wAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAmlSURBVHic7d39c1xVHcfxz92kCVh0BojVRpABRGBAKj6P4+io1LYp/hv9O/I/dNqmmU2mP9sf7SMFsSBaRMU+ZUAFB8HC1FKqJLR52D3+cJNm0ySb3XvPOd9zN+/XTGfa3eTe76T7yT3n3Hu/VwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMlz0iMXpEes68CymnUBWGGkJu2xLgLLCEha9i7+AdDKSXc76bNL0s0/SZ+zrgc5jiDpeE7S3ZLuGpR+Zl0McgQkHSNLf6m1/B22CEg6bk/OnfS8ZSFYRkAS4KRvSHqo5aUHp6SnrerBMgKShlUrV01Ws5JAQNKwas7hmIckIbMuYLNz0r2Srkrql6TLi69nUkPStqek61a1gSNICnZpMRytnNTXlHYa1IMWBMTeunONGvMQcwTEkMt//r9o8/4ex/+RKX74tr4naVub94empO/GKgarERBbGw6hHMMsUwTEFgFJHAEx4qTtkr650ddl0rNvScMRSsIaCIidEXV2Hiqbl3aHLgZrIyB2Oh46ZQyzzHAm3YCTBiRdk/T5O9+7vPrLJWl6UBp6TJoNWxnuxBHExo+1RjjauGdO+lGoYrA+AmKj6wsRuXjRBgGx0fWcgnmIDQISmcv7Xn29wPc9fln6WoCS0AYBie+XRb+xyTArOgISX+EPeUZAomOZNyInbVW+vHvXel+zzjLvktlMGnpKmvZbGdbDESSu59QmHB0YFD2zoiIgcZVeieLixbgISFy7PGxjxDE0joaAROKkHZK+6mFTD1zK+2ghAgISj7ehEfeqx0NA4vH2oWYeEg9j2QicdJ/y3ld9G33tBsu8kvKeWTXpS09KH5cuDm1xBIljtzoIR6ec1Ndo0w0F/hCQOLwPiRhmxUFAAnP5kcPH8u4KmbTnVx6PSlgbAQnvB5LuD7Dd+56Uvh9gu2hBQMILdoEhT6IKj4CEF2yuwDwkPAISkMv7WT0TcBc7zksPBNz+pkdAwnpeYc81ZX0tzzaEfwQkrOBzBJo5hMWZ9EBcfu/Gf9Rde5+OzqTfYWZQup+eWWFwBAnnJ+oyHAVtvZX32UIABCScaEMf7lUPh4CEE/NDW7hTCtojIAG4vO/VYxF3+ehU3P1tGgQkjOgn8JqcNAyCgIQRfU7APCQMlnk9c9I9yntfDRb5/gLLvEvm+qWhJ6RPi28Cd+II4t9OFQxHSQNN6ecG++1pBMQ/s7kA8xD/CIhHi/2qLJ8nuJeeWX4REL+elfQVw/1vn+rgybnoHAHxy3wliUck+EVA/DKfA9BUzi/Gq544aUjSRyrZSKHEMu+SZkPaviPvw4WSOIL4s0dpdBmp1eiZ5Q0B8SeZsT9n1f0hIB4s9r7aaV1Hi90vS/3WRfQCAuLHDxWm91VR927L+3GhJALiR3JDGpZ7/SAgfiS3tJolWFMVEZCSnPSgpKet61jDM1PSQ9ZFVB0BKW+vEj2f5GyvC+sJBKS8ZMf69MwqL8nffFWx2PvqmvKbpLzwcCa91cxWaehh6ZbfzW4eHEHK+ak8hiOArTN5fy4UREDKSX6liA7w5RCQcpJvHF3LG2ijIAJSkJOekPSodR0bcdLD56XHreuoKgJSXGWGLv0VqjU1BKS4ynzomIcUxzJvAU76gvJHGwz43rbnZd4l87ekL35H+m+YzfcujiDF7FSAcAS0ZZCeWYUQkGIqN2ThXvViCEiXFvtO7bKuo1tOGqFnVvcISPe+rfzptVXz5YvSt6yLqBpuy+xS6F/B+/btC7btZrMp1evBtt+LOIJ078+SrlgXUcBH9Xr9L9ZFVA0B6Z6TdNq6iAJOKK8dXSAgxRy3LqBbWZZVruYUEJBizkiasy6iC/POuZesi6giAlLM/yS9Zl1Ep7Ise3V8fJyz6AUQkOKqNGSpUq1JISDFVeZDV6vVKlNraghIcW9Jese6iA7889ChQ29bF1FVBKSck9YFbMQ5d8y6hiojIOVUYehShRqTRUDKeVnStHURbczMz8+ftS6iyghIObPKQ5Kql44cOUJPrBIISHknrAtoI+XaKoGAlHdciV7j1Gg0TlnXUHUEpLz3JV2yLmINFyYmJt6zLqLqCIgfya0UcXGiHwTEj+TG+s655GqqIgLix+8lfWxdRItPhoeHz1kX0QsIiB8N5ZfAJ8E5d2p0dHTBuo5eQED8SWZIU6vVkqml6giIPyeVH0msNbMse8G6iF5BQPy5JukN6yIkvT42NnbVuoheQUD8SmFpNYUaegYB8ct87M/8wy8C4tebkv5tuP8Px8bG/mq4/55DQPxykiyvf0r2urCqIiD+Wc4BmH94RkD8O6P8PpHY5hYWFuh95RkB8W9a0quxd+qcOzs5Oflp7P32OgISRvSVpCzLWL0KgICEEX0uwOXtYRCQMP4m6e8R9/fO4cOHY+5v0yAg4cQc8vw64r42FQISTrSAMP8Ih4CEc1ZSjFWlmYGBgVci7GdTIiDhzEr6TYT9nNm/f7/FeZdNgYCEFXzow73nYRGQsI4p7LVRzjmXfAPtKiMgYV2RdCHg9s/X6/UPAm5/0yMg4YU8gcfJwcAISHjB5gjMP8IjIOGdU5ieWddv3LjxeoDtogUBCa8h6bTvjWZZdvLo0aMpdFHpaQQkjhBzBeYfERCQOE7Jb8+sRn9/P72vIiAgcVyX5G2+4Jw7d+DAgZR6AfcsAhKPzyERw6tICEg83j7UzjkCEgkBiee8pH952M4H9Xr9ooftoAMEJC4fy70nRO+raAhIXKWHRgyv4iIgcb0oqcxzy2e3bNkS4x4TLCIgcc1IKnz3X5Zlvz148OC0x3qwAQISX+ELDLk4MT4CEl/hDiSNRoOAREZA4ntXed+sbr09MTHxD9/FoD0CYqPrlShWr2wQEBtdD5V4cpQNAmLjFXXXM2t6YGDgd6GKwfoIiI055edEOvUCva9sEBA7Hc8pmH/YISB2Or2myjUaDcvnHm5qBMTOh5I6eSLtm5OTk1dCF4O1ERBbnQydGF4ZIiC2CEjiCIitP0q62ub9a8PDw2/EKgarERBbTUntupOcHB0dbcYqBqsREHvrDqF4MKc9AmLvtKSFNV5vLCwsnIldDFYiIPY+kfSHNV5/bWJi4nrsYrASAUnDqgsReTBnGghIGlbNNZh/pIGApOGipPda/v3+2NjYJatisIyApKP1WYPHzKrACgQkHbfnHDRnSEe/dQG47UVJNyVlWZbR+yoRBCQdNyWdleTGx8c/sy4GOQKSluOi725SCEhaTvT19VnXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOvB/FOHOpgoUlk8AAAAASUVORK5CYII=);
|
|
||||||
opacity: 1;
|
public Rotation() {
|
||||||
}
|
const rotation = this.view ? this.view.getRotation() : 0;
|
||||||
.compass-n {
|
return `rotate(${rotation}rad)`;
|
||||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAF6AAABegB0iYb4wAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAe9SURBVHic7d07jB1XHcfx712vDXYinDhegw2YOOERYhzLxAhhAhhE4sSORUdDKioaKpoIEBHhIR4NSomgBEEdCQqKCImKAhHwxilAbpASiC3iOMkGr3cPxXizu/Zd37kz5zW734+0ze6Zmb/u3d89Z87MnAuSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSpE0qwCjAqHQdWjVTugCtc3QeHihdhFbNli5A65wJEIDnSxeihj1IXc6M4EzpIqTqBNgT4No8XDsPd5WuRw17kHo8BmwLsG0ZTpUuRg0DUo+3h1bBYZa0KjQ9x8UA4Vzzc+k5J1CqYA9Sh0+x/rxjzxx8slQxWmVA6nD6xl+MxvxO+RmQOtx0zuF5SB0MSGEB3gccGfOno/NwMHc9Ws+AlHeGje+/ejRnIbqZASlvw3ON4HlIcd45WlCAdwAXgdtXfje/vskbt8HeQ/BW3sq0wh6krJOsCccYt70On81Ui8YwIGVNHELNOMwqyoCUNfGfP8DZHIVoPANSSICPAB9s0fSe8/Dh1PVoPANSTusLgUteNCzGgJQzzT+9ASnEad4CQjNzdZFmmned+ZubA1ydhb33wZW0lelG9iBlPMKYcNzCjkX4YqpitDEDUsbUQ6YZh1lFGJDMrq97NfU9VgFOu2ZWfgYkv48DBzpst/88HItdjG7NgOTX+cr4slfVszMg+XU+l/Ahqvwc02YUYA54mVt8MG0wzbtieQn2H4X/xK1MG7EHyesx+r3mMzOumZWVAcmr9zmEiznkZUAyCbANeDjCrk65ZlY+BiSfTwN7Iuznzn3NOlrKwIDkE21o5LPq+RiQfKJN0foVCfkYkAwCvB/4WMT9HXkBPhBrf9qYAcnj8dg7XGqmjJWYAckj+jmD0715eCU9sQDvBC4Bu9q0n3Al/W0jWLgMd52Ahc7FaSJ7kPQ+T8twTCPAzt3wudj71XoGJL1kM07evJieAUkv2QLUTvemZ0ASCvBR4N6E+z/0N7gv1f5lQFJL/gm/zV4kKQOSVvJ/Xs9D0nKaN5EA76JZ+2r7NNu1neZdY3ER9h2DV6ffVJPYg6RziinD0dH2Ha6ZlYwBSSfblW4Xc0jHgCQQmtc12/cLjuBM8L1Mwhc1jQeB92Q83r5zzXpbisyApJF9ZsmlSdMwIGlkPyfwKcM0nOaNLMA+4CU6fvh0mOZdsRzgwBH4d/dd6Eb2IPGdpszrOjPKODGwVRiQ+IoNdRxmxecQK6LQrFf1CnBH1330GGIxgssLMHccFnvsRmvYg8T1ED3C0VeA3TvgRKnjb0YGJK7iU63e3RuXAYmr+DmA5yFxGZBIAhwE7i9dB3D4PNxduojNwoDEc7Z0ASuW7EWiMSDxVDP29yGqeJzmjSDATpqHo3ov79NnmnfFCBYWYO9xeDPC7rY0e5A4vkCCta+6CrBzF5wsXcdmYEDiqG5Is1xhTUNkQOKocSHp6Atmb0UGpKfQfK3B3aXrGOPgPBwuXcTQGZD+qp1S9Vn1/gxIf9WO9X3KsD+neXsIsJvm7t1oy/vEmOZd49oizLlmVnf2IP08Sp61r7qanYVHShcxZAakn+rH+H4TVT8GpKPr61CdKl3HJCM47ZpZ3fnCdfcJ4N2li5gkwNwLcLx0HUNlQLobzAyRNy92Z0C6G9LYfki1VsWAdBCaZUWHtNTngy/CgdJFDJEB6eY0w7qGNFoawIRCjQxIN4Mb03se0s2QPgWrEJoLg6/QXEWPLvKV9LVeG8HcYbia7hCbz2zpAgbofuAfqXae8hPr+rfuPp/wEJIkSZIkSZIkSZI0fN5q0s+dwB+m3OYtmpsdX+tx3GeB/S3bPgz8t8expM7mgNDh5+mex70wxbHmeh5L6qxrQK7Q73FdA5KJt7uXcTvwzdJFaDIDUs7XgHtKF6FbMyDl7ACeKl2Ebs2AlPUEcLR0EdqYASlrBvhu6SK0MQNS3peAE6WL0HgGpA4/Kl2AxjMgdfgMzUrxqowBqceP8f2ojm9IPR4Avly6CK1nQOryNHV/Ic+WY0DyuQRcntDmQ8BXM9SilgxIPleAn7Zo9xSwK3EtasmA5PUz4OUJbfYDX89Qi1owIHm9AXy/RbsngT2Ja1ELBiS/nwP/nNDmDuAbGWqRkprmgakLa7Z7okX7N4H3bnBcH5jKxB6kjF8Df53QZic+VKWB69qDAJxtsc1V4N4xx7UHycQepJxngT9OaLMdb4fXgPXpQQAearHdEnDshu3sQTKxBynrT8DvJrSZAb6XoRYpur49CMARml5i0vYn12xjD5KJPUh5fwd+06JdmwuMUlVi9CAAh4D/tdjH49fb24NkYg9ShwvAL1u0+yG+ZxqQWD0INDcpvt5iP1/BHiQbP43q8RLwTIt2PlSlwYjZg0Bzk+KlKfZpD5KYPUhdXgV+UroIrTIg9XkG+FfpItQwIPVZAH5Qugg1DEidfgG8WLoIGZBaXcO7eKtgQOr1W+AvpYvY6gxIvQLw7dJFbHUGpG6/B54rXcRWZkDq9yRNb6ICDEj9/kzzeK4KMCDD8C2ah6qUmQEZhnPAr0oXsRUZkOH4Ds1DVZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkbSX/B0lc8D0skvAeAAAAAElFTkSuQmCC);
|
}
|
||||||
transition: opacity 1s ease-out;
|
|
||||||
transition-delay: 2s;
|
public IsNorth() {
|
||||||
opacity:0;
|
return this.view ? this.view.getRotation() == 0 : true;
|
||||||
}
|
}
|
||||||
`]
|
|
||||||
})
|
ngOnInit(): void {
|
||||||
export class RotationResetComponent implements OnInit {
|
this.view = this.map.instance.getView();
|
||||||
view: View;
|
this.view.on('change:rotation', () => {
|
||||||
|
this.changeDetectorRef$.detectChanges();
|
||||||
public Rotation() {
|
});
|
||||||
let rotation = this.view ? this.view.getRotation() : 0;
|
}
|
||||||
return `rotate(${rotation}rad)`;
|
|
||||||
}
|
constructor( private map: MapComponent, private changeDetectorRef$: ChangeDetectorRef ) {
|
||||||
|
}
|
||||||
public IsNorth() {
|
|
||||||
return this.view ? this.view.getRotation() == 0 : true;
|
handleClick(event:Event) {
|
||||||
}
|
this.view.animate({ rotation: 0 });
|
||||||
|
event.preventDefault();
|
||||||
ngOnInit(): void {
|
}
|
||||||
this.view = this.map.instance.getView();
|
}
|
||||||
this.view.on('change:rotation', () => {
|
|
||||||
this.changeDetectorRef$.detectChanges();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor( @Host() private map: MapComponent, private changeDetectorRef$: ChangeDetectorRef ) {
|
|
||||||
}
|
|
||||||
|
|
||||||
handleClick(event:Event) {
|
|
||||||
this.view.animate({ rotation: 0 });
|
|
||||||
event.preventDefault();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
// import { Component, OnInit,Input } from '@angular/core';
|
|
||||||
//import { MapComponent } from 'ngx-openlayers';
|
|
||||||
//import OLCesium from 'olcs/OLCesium.js';
|
|
||||||
|
|
||||||
|
|
||||||
// @Component({
|
|
||||||
// selector: 'fm-map-switch2d3d',
|
|
||||||
// template: '<div (click)="handleClick($event)" class="rounded-circle twotreed">{{label}}</div>',
|
|
||||||
// styles: [`.twotreed {
|
|
||||||
// width:2.5em;
|
|
||||||
// height:2.5em;
|
|
||||||
// background-color: white;
|
|
||||||
// text-align:center;
|
|
||||||
// line-height:2.5em;
|
|
||||||
// font-weight:bold;
|
|
||||||
// cursor:default;}`]
|
|
||||||
|
|
||||||
// })
|
|
||||||
// export class Switch2D3DComponent {
|
|
||||||
|
|
||||||
// @Input() enable:boolean;
|
|
||||||
// public label: string = "3D";
|
|
||||||
// private ol3d: OLCesium;
|
|
||||||
|
|
||||||
|
|
||||||
// constructor(private map: MapComponent) {
|
|
||||||
|
|
||||||
// }
|
|
||||||
|
|
||||||
// ngOnInit() {
|
|
||||||
// this.ol3d = new OLCesium({ map: this.map.instance }); // ol2dMap is the ol.Map instance
|
|
||||||
// }
|
|
||||||
|
|
||||||
// handleClick(event) {
|
|
||||||
// this.enable = !this.enable;
|
|
||||||
// if (this.enable)
|
|
||||||
// this.ol3d.setEnabled(this.enable);
|
|
||||||
// this.label = this.enable?"2D":"3D";
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
+52
-38
@@ -1,39 +1,53 @@
|
|||||||
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 {
|
})
|
||||||
view: ViewComponent;
|
export class ZoomToExtentComponent implements OnChanges {
|
||||||
map: MapComponent;
|
view: ViewComponent;
|
||||||
@Input() extent: number[];
|
map: MapComponent;
|
||||||
@Input() animate: boolean = false;
|
paddingTop = 0;
|
||||||
|
paddingLeft = 0;
|
||||||
constructor(@Host() view: ViewComponent, @Host() map: MapComponent) {
|
paddingBottom = 0;
|
||||||
this.view = view;
|
paddingRight = 0;
|
||||||
this.map = map;
|
|
||||||
}
|
@Input() extent: number[];
|
||||||
|
@Input() animate = false;
|
||||||
ngOnChanges(changes: SimpleChanges) {
|
|
||||||
if (this.extent) {
|
constructor(@Host() view: ViewComponent, @Host() map: MapComponent,route: ActivatedRoute ) {
|
||||||
var options = { padding: [0, 0, 0, 0],minResolution:1 };
|
this.view = view;
|
||||||
let size = this.map.instance.getSize();
|
this.map = map;
|
||||||
let rem = parseFloat(getComputedStyle(document.documentElement).fontSize);
|
if(route && route.snapshot && route.snapshot.data && route.snapshot.data["fm-map-zoom-to-extent"]) {
|
||||||
let threshold = 44 * rem;
|
const params = route.snapshot.data["fm-map-zoom-to-extent"];
|
||||||
var left = 1 * rem;
|
this.paddingTop = params["padding-top"] ? params["padding-top"] : 0;
|
||||||
var right = 1 * rem;
|
this.paddingBottom = params["padding-bottom"] ? params["padding-bottom"] : 0;
|
||||||
var bottom = Math.round(size[1] / 2);
|
this.paddingLeft = params["padding-left"] ? params["padding-left"] : 0;
|
||||||
var top = 1 * rem;
|
this.paddingRight = params["padding-right"] ? params["padding-right"] : 0;
|
||||||
if (size[0] > threshold) {
|
}
|
||||||
bottom = 1 * rem;
|
}
|
||||||
left = 23 * rem;
|
|
||||||
}
|
ngOnChanges(changes: SimpleChanges) {
|
||||||
options.padding = [top, right, bottom, left];
|
if (this.extent) {
|
||||||
if (this.animate) options["duration"] = 2000;
|
const options = { padding: [0, 0, 0, 0],minResolution:1 };
|
||||||
this.view.instance.fit(this.extent, options);
|
const size = this.map.instance.getSize();
|
||||||
}
|
const rem = parseFloat(getComputedStyle(document.documentElement).fontSize);
|
||||||
}
|
const threshold = 40 * rem;
|
||||||
}
|
let left = 1 * rem;
|
||||||
|
const right = 1 * rem;
|
||||||
|
let bottom = Math.round((size[1] / 2) + (4*rem));
|
||||||
|
const top = 1 * rem;
|
||||||
|
if (size[0] > threshold) {
|
||||||
|
bottom = 5 * rem;
|
||||||
|
left = 23 * rem;
|
||||||
|
}
|
||||||
|
options.padding = [top + (this.paddingTop*rem), right+ (this.paddingRight*rem), bottom + (this.paddingBottom*rem), left+ (this.paddingLeft*rem)];
|
||||||
|
if (this.animate) options["duration"] = 1000;
|
||||||
|
this.view.instance.fit(this.extent, options);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+14
-19
@@ -1,19 +1,14 @@
|
|||||||
@import "../../_theme.scss";
|
.row {
|
||||||
@import "~bootstrap/scss/bootstrap.scss";
|
border-bottom: 1px solid var(--bs-gray-500);
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
.row {
|
.row.selected {
|
||||||
border-bottom: 1px solid gray('500');
|
background-color: var(--bs-gray-100);
|
||||||
user-select: none;
|
}
|
||||||
}
|
|
||||||
|
@media screen and (min-width: 44rem) {
|
||||||
.row:hover {
|
.feature-list-container {
|
||||||
background-color: gray('100');
|
margin-top: 4rem;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
@media screen and (min-width: 44rem) {
|
|
||||||
.feature-list-container {
|
|
||||||
margin-top: 4rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
+92
-58
@@ -1,59 +1,93 @@
|
|||||||
import { Component, Input, OnInit, ComponentFactoryResolver, ViewChild, SimpleChanges, ComponentFactory, Inject, Type} from '@angular/core';
|
import { Component, Input, OnInit, ComponentFactoryResolver, ViewChild, SimpleChanges, ComponentFactory, Inject} from '@angular/core';
|
||||||
import { Feature } from 'ol';
|
import { Feature } from 'ol';
|
||||||
import { FeatureListComponent,AbstractFeatureListComponent } from '../feature-list/feature-list.component';
|
import { Geometry} from 'ol/geom';
|
||||||
import { WidgetHostDirective } from '../widget-host/widget-host.directive';
|
import { FeatureListComponent,AbstractFeatureListComponent } from '../feature-list/feature-list.component';
|
||||||
import {IQueryState } from '../../models/query.state';
|
import { WidgetHostDirective } from '../widget-host/widget-host.directive';
|
||||||
import * as mapReducers from '../../reducers/map.reducer';
|
import {IQueryState,PackageService } from '@farmmaps/common';
|
||||||
import * as mapActions from '../../actions/map.actions';
|
import * as mapReducers from '../../reducers/map.reducer';
|
||||||
import { Store } from '@ngrx/store';
|
import * as mapActions from '../../actions/map.actions';
|
||||||
|
import { Store } from '@ngrx/store';
|
||||||
|
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 {
|
||||||
constructor(private store: Store<mapReducers.State>,private componentFactoryResolver: ComponentFactoryResolver, @Inject(AbstractFeatureListComponent) public featureLists: AbstractFeatureListComponent[] ) {
|
|
||||||
}
|
constructor(private store: Store<mapReducers.State>,private componentFactoryResolver: ComponentFactoryResolver, @Inject(AbstractFeatureListComponent) public featureLists: AbstractFeatureListComponent[],private packageService:PackageService ) {
|
||||||
|
this.featureLists = [...this.featureLists].reverse();
|
||||||
@Input() features: Array<Feature>
|
}
|
||||||
@Input() queryState: IQueryState;
|
|
||||||
|
@Input() features: Array<Feature<Geometry>>
|
||||||
@ViewChild(WidgetHostDirective) widgetHost: WidgetHostDirective;
|
@Input() queryState: IQueryState;
|
||||||
|
@Input() selectedFeature: Feature<Geometry>;
|
||||||
loadComponent(queryState:IQueryState) {
|
@Input() clickedFeature:Observable<Feature<Geometry>>;
|
||||||
var componentFactory: ComponentFactory<AbstractFeatureListComponent> = this.componentFactoryResolver.resolveComponentFactory(FeatureListComponent); // default
|
|
||||||
var selected = -1;
|
@ViewChild(WidgetHostDirective, { static: true }) widgetHost: WidgetHostDirective;
|
||||||
for (var i = 0; i < this.featureLists.length; i++) {
|
componentRef:any;
|
||||||
if (this.featureLists[i]['forItemType'] == queryState.itemType && this.featureLists[i]['forChild'] && queryState.parentCode && queryState.parentCode != "") {
|
|
||||||
selected = i;
|
loadComponent(queryState:IQueryState) {
|
||||||
break;
|
let componentFactory: ComponentFactory<AbstractFeatureListComponent> = this.componentFactoryResolver.resolveComponentFactory(FeatureListComponent); // default
|
||||||
} else if (this.featureLists[i]['forItemType'] == queryState.itemType) {
|
let selected = -1;
|
||||||
selected = i;
|
let maxMatches =0;
|
||||||
break;
|
const showItem = true;
|
||||||
}
|
for (let i = 0; i < this.featureLists.length; i++) {
|
||||||
}
|
let matches=0;
|
||||||
if (selected >= 0) {
|
let criteria=0;
|
||||||
componentFactory = this.componentFactoryResolver.resolveComponentFactory(this.featureLists[i]['constructor'] as any);
|
if (this.featureLists[i]['forItemType']) {
|
||||||
if (this.featureLists[selected]['collapseSearch'] === true) {
|
criteria++;
|
||||||
this.store.dispatch(new mapActions.CollapseSearch());
|
if( this.featureLists[i]['forItemType'].split(",").filter(part => part == queryState.itemType).length == 1) {
|
||||||
}
|
matches++;
|
||||||
}
|
}
|
||||||
const viewContainerRef = this.widgetHost.viewContainerRef;
|
}
|
||||||
viewContainerRef.clear();
|
if(this.featureLists[i]['forChild'] ) {
|
||||||
|
criteria++;
|
||||||
const componentRef = viewContainerRef.createComponent(componentFactory);
|
if(queryState.parentCode && queryState.parentCode != "") {
|
||||||
(<AbstractFeatureListComponent>componentRef.instance).features = this.features;
|
matches++;
|
||||||
(<AbstractFeatureListComponent>componentRef.instance).queryState = this.queryState;
|
}
|
||||||
}
|
}
|
||||||
|
if(criteria == matches && matches > maxMatches) {
|
||||||
ngOnChanges(changes: SimpleChanges) {
|
selected=i;
|
||||||
if (changes["features"] && changes["features"].currentValue) {
|
maxMatches = matches;
|
||||||
if (this.queryState) {
|
}
|
||||||
this.loadComponent(this.queryState);
|
}
|
||||||
}
|
if (selected >= 0) {
|
||||||
}
|
componentFactory = this.componentFactoryResolver.resolveComponentFactory(this.featureLists[selected]['constructor'] as any);
|
||||||
}
|
if (this.featureLists[selected]['collapseSearch'] === true) {
|
||||||
}
|
this.store.dispatch(new mapActions.CollapseSearch());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const viewContainerRef = this.widgetHost.viewContainerRef;
|
||||||
|
viewContainerRef.clear();
|
||||||
|
if(showItem) {
|
||||||
|
this.componentRef = viewContainerRef.createComponent(componentFactory);
|
||||||
|
(<AbstractFeatureListComponent>this.componentRef.instance).features = this.features;
|
||||||
|
(<AbstractFeatureListComponent>this.componentRef.instance).queryState = this.queryState;
|
||||||
|
(<AbstractFeatureListComponent>this.componentRef.instance).selectedFeature = this.selectedFeature;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
this.clickedFeature.subscribe((feature => {
|
||||||
|
(<AbstractFeatureListComponent>this.componentRef.instance).handleFeatureClick(feature);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnChanges(changes: SimpleChanges) {
|
||||||
|
if ((changes["queryState"] && changes["queryState"].currentValue)) {
|
||||||
|
this.loadComponent(changes["queryState"].currentValue);
|
||||||
|
}
|
||||||
|
if ((changes["features"] && changes["features"].currentValue)) {
|
||||||
|
(<AbstractFeatureListComponent>this.componentRef.instance).features = changes["features"].currentValue;
|
||||||
|
this.componentRef.changeDetectorRef.detectChanges();
|
||||||
|
}
|
||||||
|
if(changes["selectedFeature"]) {
|
||||||
|
(<AbstractFeatureListComponent>this.componentRef.instance).selectedFeature = changes["selectedFeature"].currentValue;
|
||||||
|
this.componentRef.changeDetectorRef.detectChanges();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+15
-9
@@ -1,14 +1,20 @@
|
|||||||
<div *ngIf="features;let features">
|
<div class="card border-0">
|
||||||
<div class="card border-0">
|
@if ((schemeItem|async); as schemeItem) {
|
||||||
<div class="card-body" *ngIf="(schemeItem|async);let schemeItem">
|
<div class="card-body">
|
||||||
<div><a href="#" (click)="handleBackClick($event)" i18n>back</a></div>
|
<fm-back-button></fm-back-button>
|
||||||
<h4 i18n>Farm</h4>
|
<h4 i18n>Farm</h4>
|
||||||
<h3>{{schemeItem.name}}</h3>
|
<h3>{{schemeItem.name}}</h3>
|
||||||
<div class="cropfields">
|
@if (features; as features) {
|
||||||
<div class="row m-0" *ngFor="let feature of features" (click)="handleFeatureClick(feature)" (mouseenter)="handleFeatureMouseEnter(feature)" (mouseleave)="handleFeatureMouseLeave(feature)">
|
<div>
|
||||||
<fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container>
|
<div class="cropfields">
|
||||||
|
@for (feature of features; track feature) {
|
||||||
|
<div class="row m-0 ps-3 pe-3" [ngClass]="{'selected':isFeatureSelected(feature)}" (click)="handleFeatureClick(feature)" (mouseenter)="handleFeatureMouseEnter(feature)" (mouseleave)="handleFeatureMouseLeave(feature)">
|
||||||
|
<fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+20
-23
@@ -1,23 +1,20 @@
|
|||||||
@import "../../_theme.scss";
|
fm-map-feature-list-feature-container {
|
||||||
@import "~bootstrap/scss/bootstrap.scss";
|
width:100%;
|
||||||
|
pointer-events:none;
|
||||||
feature-list-feature-container {
|
}
|
||||||
width:100%;
|
|
||||||
pointer-events:none;
|
.row {
|
||||||
}
|
border-bottom: 1px solid var(--bs-gray-500);
|
||||||
|
user-select: none;
|
||||||
.row {
|
padding-left:1.5rem;
|
||||||
border-bottom: 1px solid gray('500');
|
}
|
||||||
user-select: none;
|
|
||||||
padding-left:1.5rem;
|
.row.selected {
|
||||||
}
|
background-color: var(--bs-gray-100);
|
||||||
|
}
|
||||||
.row:hover {
|
|
||||||
background-color: gray('100');
|
.cropfields {
|
||||||
}
|
border-top: 1px solid var(--bs-gray-500);
|
||||||
|
margin-left: -1.25rem;
|
||||||
.cropfields {
|
margin-right: -1.25rem;
|
||||||
border-top: 1px solid gray('500');
|
}
|
||||||
margin-left: -1.5rem;
|
|
||||||
margin-right: -1.5rem;
|
|
||||||
}
|
|
||||||
|
|||||||
+29
-28
@@ -1,30 +1,31 @@
|
|||||||
import { Component, Injectable,AfterViewInit, OnInit} from '@angular/core';
|
import { Component, Injectable,AfterViewInit, OnInit,SimpleChanges, ChangeDetectorRef} from '@angular/core';
|
||||||
import { Location } from '@angular/common';
|
import { Location } from '@angular/common';
|
||||||
import { AbstractFeatureListComponent } from '../feature-list/feature-list.component';
|
import { AbstractFeatureListComponent } from '../feature-list/feature-list.component';
|
||||||
import {ForItemType } from '../for-item/for-itemtype.decorator';
|
import {ForItemType } from '../for-item/for-itemtype.decorator';
|
||||||
import {ForChild } from '../for-item/for-child.decorator';
|
import {ForChild } from '../for-item/for-child.decorator';
|
||||||
import { Store } from '@ngrx/store';
|
import { Store } from '@ngrx/store';
|
||||||
import * as mapReducers from '../../reducers/map.reducer';
|
import * as mapReducers from '../../reducers/map.reducer';
|
||||||
import { commonReducers, ItemTypeService, IItem,ItemService } from '@farmmaps/common';
|
import { commonReducers, ItemTypeService, IItem,ItemService } from '@farmmaps/common';
|
||||||
import { Observable } from 'rxjs';
|
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 {
|
||||||
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, private itemService: ItemService) {
|
|
||||||
super(store, itemTypeService,location);
|
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, private itemService: ItemService) {
|
||||||
}
|
super(store, itemTypeService,location);
|
||||||
|
}
|
||||||
public schemeItem: Observable<IItem>
|
|
||||||
|
public schemeItem: Observable<IItem>
|
||||||
ngOnInit() {
|
|
||||||
this.schemeItem = this.itemService.getItem(this.queryState.parentCode);
|
ngOnInit() {
|
||||||
}
|
this.schemeItem = this.itemService.getItem(this.queryState.parentCode);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|||||||
+13
-9
@@ -1,13 +1,17 @@
|
|||||||
<div *ngIf="features;let features">
|
<div class="card border-0">
|
||||||
<div class="card border-0">
|
<div class="card-body">
|
||||||
<div class="card-body">
|
<fm-back-button></fm-back-button>
|
||||||
<div><a href="#" (click)="handleBackClick($event)" i18n>Back</a></div>
|
<h3><i class="far fa-farm"></i> <span i18n>Farms</span></h3>
|
||||||
<h3 i18n><i class="fm fm-farm"></i> Farms</h3>
|
@if (features; as features) {
|
||||||
<div class="farms">
|
<div>
|
||||||
<div class="row m-0" *ngFor="let feature of features" (click)="handleFeatureClick(feature)" (mouseenter)="handleFeatureMouseEnter(feature)" (mouseleave)="handleFeatureMouseLeave(feature)">
|
<div class="farms">
|
||||||
<fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container>
|
@for (feature of features; track feature) {
|
||||||
|
<div class="row m-0 ps-3 pe-3"[ngClass]="{'selected':isFeatureSelected(feature)}" (click)="handleFeatureClick(feature)" (mouseenter)="handleFeatureMouseEnter(feature)" (mouseleave)="handleFeatureMouseLeave(feature)">
|
||||||
|
<fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+20
-23
@@ -1,23 +1,20 @@
|
|||||||
@import "../../_theme.scss";
|
fm-map-feature-list-feature-container {
|
||||||
@import "~bootstrap/scss/bootstrap.scss";
|
width:100%;
|
||||||
|
pointer-events:none;
|
||||||
feature-list-feature-container {
|
}
|
||||||
width:100%;
|
|
||||||
pointer-events:none;
|
.row {
|
||||||
}
|
border-bottom: 1px solid var(--bs-gray-500);
|
||||||
|
user-select: none;
|
||||||
.row {
|
padding-left:1.5rem;
|
||||||
border-bottom: 1px solid gray('500');
|
}
|
||||||
user-select: none;
|
|
||||||
padding-left:1.5rem;
|
.row.selected {
|
||||||
}
|
background-color: var(--bs-gray-100);
|
||||||
|
}
|
||||||
.row:hover {
|
|
||||||
background-color: gray('100');
|
.farms {
|
||||||
}
|
border-top: 1px solid var(--bs-gray-500);
|
||||||
|
margin-left: -1.25rem;
|
||||||
.farms {
|
margin-right: -1.25rem;
|
||||||
border-top: 1px solid gray('500');
|
}
|
||||||
margin-left: -1.5rem;
|
|
||||||
margin-right: -1.5rem;
|
|
||||||
}
|
|
||||||
|
|||||||
+29
-26
@@ -1,29 +1,32 @@
|
|||||||
import { Component, Injectable } from '@angular/core';
|
import { Component, Injectable } from '@angular/core';
|
||||||
import { Location } from '@angular/common';
|
import { Location } from '@angular/common';
|
||||||
import { AbstractFeatureListComponent } from '../feature-list/feature-list.component';
|
import { AbstractFeatureListComponent } from '../feature-list/feature-list.component';
|
||||||
import { ForItemType } from '../for-item/for-itemtype.decorator';
|
import { ForItemType } from '../for-item/for-itemtype.decorator';
|
||||||
import { Store } from '@ngrx/store';
|
import { Store,Action } from '@ngrx/store';
|
||||||
import * as mapReducers from '../../reducers/map.reducer';
|
import * as mapReducers from '../../reducers/map.reducer';
|
||||||
import { commonReducers, ItemTypeService } from '@farmmaps/common';
|
import { commonReducers, ItemTypeService } from '@farmmaps/common';
|
||||||
import * as mapActions from '../../actions/map.actions';
|
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';
|
||||||
@ForItemType("vnd.farmmaps.itemtype.croppingscheme")
|
import { Geometry} from 'ol/geom';
|
||||||
@Injectable()
|
|
||||||
|
@ForItemType("vnd.farmmaps.itemtype.croppingscheme")
|
||||||
|
@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 {
|
||||||
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, private router: Router) {
|
|
||||||
super(store, itemTypeService, location);
|
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, private router: Router) {
|
||||||
}
|
super(store, itemTypeService, location);
|
||||||
|
}
|
||||||
handleFeatureClick(feature) {
|
|
||||||
var queryState = tassign(mapReducers.initialState.queryState, { parentCode: feature.get('code'), itemType: "vnd.farmmaps.itemtype.cropfield" });
|
getAction(feature:Feature<Geometry>):Action {
|
||||||
this.store.dispatch(new mapActions.DoQuery(queryState));
|
const queryState = tassign(mapReducers.initialState.queryState, { parentCode: feature.get('code'), itemType: "vnd.farmmaps.itemtype.cropfield" });
|
||||||
}
|
return new mapActions.DoQuery(queryState);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|||||||
+61
-42
@@ -1,43 +1,62 @@
|
|||||||
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 { AbstractFeatureListFeatureComponent,FeatureListFeatureComponent } from '../feature-list-feature/feature-list-feature.component';
|
import { Geometry } from 'ol/geom';
|
||||||
import { WidgetHostDirective } from '../widget-host/widget-host.directive';
|
import { AbstractFeatureListFeatureComponent,FeatureListFeatureComponent } from '../feature-list-feature/feature-list-feature.component';
|
||||||
|
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 {
|
||||||
constructor(private componentFactoryResolver: ComponentFactoryResolver, @Inject(AbstractFeatureListFeatureComponent) public featureLists: AbstractFeatureListFeatureComponent[] ) {
|
|
||||||
}
|
constructor(private componentFactoryResolver: ComponentFactoryResolver, @Inject(AbstractFeatureListFeatureComponent) public featureLists: AbstractFeatureListFeatureComponent[] ) {
|
||||||
|
this.featureLists = [...this.featureLists].reverse();
|
||||||
@Input() feature: Feature;
|
}
|
||||||
|
|
||||||
@ViewChild(WidgetHostDirective) widgetHost: WidgetHostDirective;
|
@Input() feature: Feature<Geometry>;
|
||||||
|
|
||||||
loadComponent() {
|
@ViewChild(WidgetHostDirective, { static: true }) widgetHost: WidgetHostDirective;
|
||||||
var componentFactory: ComponentFactory<AbstractFeatureListFeatureComponent> = this.componentFactoryResolver.resolveComponentFactory(FeatureListFeatureComponent); // default
|
|
||||||
for (var i = 0; i < this.featureLists.length; i++) {
|
loadComponent() {
|
||||||
if (this.featureLists[i]['forItemType'] == this.feature.get("itemType")) {
|
let componentFactory: ComponentFactory<AbstractFeatureListFeatureComponent> = this.componentFactoryResolver.resolveComponentFactory(FeatureListFeatureComponent); // default
|
||||||
componentFactory = this.componentFactoryResolver.resolveComponentFactory(this.featureLists[i]['constructor'] as any);
|
|
||||||
}
|
let selected = -1;
|
||||||
}
|
let maxMatches =0;
|
||||||
const viewContainerRef = this.widgetHost.viewContainerRef;
|
for (let i = 0; i < this.featureLists.length; i++) {
|
||||||
viewContainerRef.clear();
|
let matches=0;
|
||||||
|
let criteria=0;
|
||||||
const componentRef = viewContainerRef.createComponent(componentFactory);
|
if (this.featureLists[i]['forItemType']) {
|
||||||
(<AbstractFeatureListFeatureComponent>componentRef.instance).feature = this.feature;
|
criteria++;
|
||||||
}
|
if(this.featureLists[i]['forItemType'].split(",").filter(part => part == this.feature.get("itemType")).length == 1) {
|
||||||
|
matches++;
|
||||||
ngOnChanges(changes: SimpleChanges) {
|
}
|
||||||
if (changes["feature"] && changes["feature"].currentValue) {
|
}
|
||||||
this.loadComponent();
|
if(criteria == matches && matches > maxMatches) {
|
||||||
}
|
selected=i;
|
||||||
}
|
maxMatches = matches;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (selected >= 0) {
|
||||||
|
componentFactory = this.componentFactoryResolver.resolveComponentFactory(this.featureLists[selected]['constructor'] as any);
|
||||||
|
}
|
||||||
|
|
||||||
|
const viewContainerRef = this.widgetHost.viewContainerRef;
|
||||||
|
viewContainerRef.clear();
|
||||||
|
|
||||||
|
const componentRef = viewContainerRef.createComponent(componentFactory);
|
||||||
|
(<AbstractFeatureListFeatureComponent>componentRef.instance).feature = this.feature;
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnChanges(changes: SimpleChanges) {
|
||||||
|
if (changes["feature"] && changes["feature"].currentValue) {
|
||||||
|
this.loadComponent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+16
-6
@@ -1,6 +1,16 @@
|
|||||||
<div *ngIf="feature;let feature" class="row m-0">
|
@if (feature; as feature) {
|
||||||
<div class="col p-2">
|
<div class="d-flex m-0">
|
||||||
<h1 class="card-title" title="{{feature.get('name')}}">{{feature.get('name')}}</h1>
|
<div class="p-2">
|
||||||
<div class="card-text"><span>{{feature.get('datadate')|date}}</span> - <span>{{feature.get('dataenddate')|date}}</span> </div>
|
<div class="thumbnail">
|
||||||
</div>
|
<fm-map-feature-thumbnail [feature]="feature"></fm-map-feature-thumbnail>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="flex-grow p-2 overflow-hidden">
|
||||||
|
<h1 class="card-title" title="{{feature.get('name')}}">{{feature.get('name')}}</h1>
|
||||||
|
<div class="card-text"><span>{{areaInHa(feature)| number:'1.2-2'}}
|
||||||
|
ha</span> <span>{{feature.get('cropTypeName')}}</span> </div>
|
||||||
|
<div class="card-text"><span>{{feature.get('datadate')|date}}</span> -
|
||||||
|
<span>{{feature.get('dataenddate')|date}}</span> </div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
+22
-30
@@ -1,30 +1,22 @@
|
|||||||
@import "../../_theme.scss";
|
.card-title {
|
||||||
@import "~bootstrap/scss/bootstrap.scss";
|
font-size: 1rem;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
.card-title {
|
}
|
||||||
font-size: 1rem;
|
|
||||||
white-space: nowrap;
|
.card-text {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
white-space: nowrap;
|
||||||
}
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
.thumbnail > img {
|
|
||||||
width: 100%;
|
.col {
|
||||||
height: auto;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.thumbnail > div {
|
.thumbnail {
|
||||||
width: 100%;
|
width: 4em;
|
||||||
font-size: 2rem;
|
height: 4em;
|
||||||
text-align: center;
|
}
|
||||||
min-height: 3rem;
|
|
||||||
color: white;
|
|
||||||
padding-top: 0.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.col {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user