Archived
Compare commits
814
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 |
@@ -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
|
||||||
@@ -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,4 @@ 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/*
|
||||||
|
|||||||
Vendored
+54
@@ -0,0 +1,54 @@
|
|||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
environment {
|
||||||
|
PACKAGE_VERSION_PREFIX=sh(script: 'jq .version package.json |sed "s/\\"//g"', returnStdout: true).trim()
|
||||||
|
PACKAGE_VERSION="${PACKAGE_VERSION_PREFIX}"
|
||||||
|
}
|
||||||
|
stages {
|
||||||
|
stage('npm install'){
|
||||||
|
steps {
|
||||||
|
sh '''rm -rf node_modules/
|
||||||
|
npm install --legacy-peer-deps
|
||||||
|
cd projects/common
|
||||||
|
npm install --legacy-peer-deps
|
||||||
|
cd ../common-map
|
||||||
|
npm install --legacy-peer-deps
|
||||||
|
cd ../common-map3d
|
||||||
|
npm install --legacy-peer-deps
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('build'){
|
||||||
|
steps {
|
||||||
|
sh '''ng build common --configuration production
|
||||||
|
ng build common-map --configuration production
|
||||||
|
ng build common-map3d --configuration production'''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('npm publish'){
|
||||||
|
steps {
|
||||||
|
sh '''cd dist/common
|
||||||
|
npm version ${PACKAGE_VERSION} --allow-same-version
|
||||||
|
npm publish
|
||||||
|
cd ../common-map
|
||||||
|
npm version ${PACKAGE_VERSION} --allow-same-version
|
||||||
|
npm publish
|
||||||
|
cd ../common-map3d
|
||||||
|
npm version ${PACKAGE_VERSION} --allow-same-version
|
||||||
|
npm publish'''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
emailext (
|
||||||
|
body: '${DEFAULT_CONTENT}',
|
||||||
|
mimeType: 'text/html',
|
||||||
|
replyTo: '${DEFAULT_REPLYTO}',
|
||||||
|
subject: '${DEFAULT_SUBJECT}',
|
||||||
|
to: emailextrecipients([[$class: 'CulpritsRecipientProvider'], [$class: 'RequesterRecipientProvider']])
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+53
-46
@@ -1,47 +1,54 @@
|
|||||||
pipeline {
|
pipeline {
|
||||||
agent any
|
agent any
|
||||||
environment {
|
environment {
|
||||||
PACKAGE_VERSION_PREFIX=sh(script: 'jq .version package.json |sed "s/\\"//g"', returnStdout: true).trim()
|
PACKAGE_VERSION_PREFIX=sh(script: 'jq .version package.json |sed "s/\\"//g"', returnStdout: true).trim()
|
||||||
PACKAGE_VERSION="${PACKAGE_VERSION_PREFIX + '-prerelease.' + env.BUILD_NUMBER}"
|
PACKAGE_VERSION="${PACKAGE_VERSION_PREFIX + '-prerelease.' + env.BUILD_NUMBER}"
|
||||||
}
|
}
|
||||||
stages {
|
stages {
|
||||||
stage('npm install'){
|
stage('npm install'){
|
||||||
steps {
|
steps {
|
||||||
sh '''npm install
|
sh '''rm -rf node_modules/
|
||||||
cd projects/common
|
npm install --legacy-peer-deps
|
||||||
npm install
|
cd projects/common
|
||||||
cd ../common-map
|
npm install --legacy-peer-deps
|
||||||
npm install
|
cd ../common-map
|
||||||
'''
|
npm install --legacy-peer-deps
|
||||||
}
|
cd ../common-map3d
|
||||||
}
|
npm install --legacy-peer-deps
|
||||||
stage('build'){
|
'''
|
||||||
steps {
|
}
|
||||||
sh '''ng build common
|
}
|
||||||
ng build common-map'''
|
stage('build'){
|
||||||
}
|
steps {
|
||||||
}
|
sh '''ng build common --configuration production
|
||||||
stage('npm publish'){
|
ng build common-map --configuration production
|
||||||
steps {
|
ng build common-map3d --configuration production'''
|
||||||
sh '''cd dist/common
|
}
|
||||||
npm version ${PACKAGE_VERSION}
|
}
|
||||||
npm publish
|
stage('npm publish'){
|
||||||
cd ../common-map
|
steps {
|
||||||
npm version ${PACKAGE_VERSION}
|
sh '''cd dist/common
|
||||||
npm publish'''
|
npm version ${PACKAGE_VERSION}
|
||||||
}
|
npm publish
|
||||||
}
|
cd ../common-map
|
||||||
|
npm version ${PACKAGE_VERSION}
|
||||||
}
|
npm publish
|
||||||
post {
|
cd ../common-map3d
|
||||||
always {
|
npm version ${PACKAGE_VERSION}
|
||||||
emailext (
|
npm publish'''
|
||||||
body: '${DEFAULT_CONTENT}',
|
}
|
||||||
mimeType: 'text/html',
|
}
|
||||||
replyTo: '${DEFAULT_REPLYTO}',
|
|
||||||
subject: '${DEFAULT_SUBJECT}',
|
}
|
||||||
to: emailextrecipients([[$class: 'CulpritsRecipientProvider'], [$class: 'RequesterRecipientProvider']])
|
post {
|
||||||
)
|
always {
|
||||||
}
|
emailext (
|
||||||
}
|
body: '${DEFAULT_CONTENT}',
|
||||||
|
mimeType: 'text/html',
|
||||||
|
replyTo: '${DEFAULT_REPLYTO}',
|
||||||
|
subject: '${DEFAULT_SUBJECT}',
|
||||||
|
to: emailextrecipients([[$class: 'CulpritsRecipientProvider'], [$class: 'RequesterRecipientProvider']])
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,59 +1,59 @@
|
|||||||
# Farmmaps viewer
|
# Farmmaps viewer
|
||||||
|
|
||||||
This is a sample FarmMaps client in Angular 7.x.
|
This is a sample FarmMaps client in Angular 7.x.
|
||||||
|
|
||||||
|
|
||||||
## Quick start
|
## Quick start
|
||||||
|
|
||||||
Use one of the two options below to get started.
|
Use one of the two options below to get started.
|
||||||
|
|
||||||
## Option 1, Using docker
|
## Option 1, Using docker
|
||||||
|
|
||||||
*Dependencies*
|
*Dependencies*
|
||||||
|
|
||||||
* docker desktop
|
* docker desktop
|
||||||
|
|
||||||
*Setup*
|
*Setup*
|
||||||
|
|
||||||
```
|
```
|
||||||
docker pull node: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
|
||||||
```
|
```
|
||||||
git clone https://git.akkerweb.nl/FarmMaps/FarmMapsLib.git
|
git clone https://git.akkerweb.nl/FarmMaps/FarmMapsLib.git
|
||||||
cd FarmMapsLib
|
cd FarmMapsLib
|
||||||
npm config set @farmmaps:registry https://repository.akkerweb.nl/repository/npm-group/
|
npm config set @farmmaps:registry https://repository.akkerweb.nl/repository/npm-group/
|
||||||
npm install -g @angular/cli
|
npm install -g @angular/cli
|
||||||
npm install
|
npm install
|
||||||
ng serve --host 0.0.0.0
|
ng serve --host 0.0.0.0
|
||||||
```
|
```
|
||||||
*Go*
|
*Go*
|
||||||
|
|
||||||
Point your browser to http://localhost:4200
|
Point your browser to http://localhost:4200
|
||||||
|
|
||||||
## Option 2, Using local machine
|
## Option 2, Using local machine
|
||||||
|
|
||||||
*Dependencies*
|
*Dependencies*
|
||||||
|
|
||||||
* npm 6.9.0
|
* npm 6.9.0
|
||||||
* nodejs 10.16.0
|
* nodejs 10.16.0
|
||||||
* git
|
* git
|
||||||
|
|
||||||
*Setup*
|
*Setup*
|
||||||
|
|
||||||
```
|
```
|
||||||
git clone https://git.akkerweb.nl/FarmMaps/FarmMapsLib.git
|
git clone https://git.akkerweb.nl/FarmMaps/FarmMapsLib.git
|
||||||
cd FarmMapsLib
|
cd FarmMapsLib
|
||||||
npm config set @farmmaps:registry https://repository.akkerweb.nl/repository/npm-group/
|
npm config set @farmmaps:registry https://repository.akkerweb.nl/repository/npm-group/
|
||||||
npm install -g @angular/cli
|
npm install -g @angular/cli
|
||||||
npm install
|
npm install
|
||||||
ng serve
|
ng serve
|
||||||
```
|
```
|
||||||
*Go*
|
*Go*
|
||||||
|
|
||||||
Point your browser to http://localhost:4200
|
Point your browser to http://localhost:4200
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+100
-62
@@ -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,22 +76,55 @@
|
|||||||
{
|
{
|
||||||
"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",
|
||||||
@@ -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,12 +205,17 @@
|
|||||||
"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": {
|
||||||
"builder": "@angular-devkit/build-angular:karma",
|
"builder": "@angular-devkit/build-angular:karma",
|
||||||
"options": {
|
"options": {
|
||||||
@@ -203,21 +223,39 @@
|
|||||||
"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"
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"lint": {
|
}
|
||||||
"builder": "@angular-devkit/build-angular:tslint",
|
},
|
||||||
|
"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": {
|
"options": {
|
||||||
"tsConfig": [
|
"tsConfig": "projects/common-map3d/tsconfig.lib.json",
|
||||||
"projects/common-map/tsconfig.lib.json",
|
"project": "projects/common-map3d/ng-package.json"
|
||||||
"projects/common-map/tsconfig.spec.json"
|
},
|
||||||
],
|
"configurations": {
|
||||||
"exclude": [
|
"production": {
|
||||||
"**/node_modules/**"
|
"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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"defaultProject": "farmmaps-lib-app"
|
"cli": {
|
||||||
|
"analytics": false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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.
+457
-23
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 73 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -23,6 +23,36 @@
|
|||||||
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";
|
||||||
|
}
|
||||||
|
|
||||||
|
hallo
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "FarmMaps";
|
font-family: "FarmMaps";
|
||||||
src: url("./FMIconFont.woff") format("woff"), /* Modern Browsers */
|
src: url("./FMIconFont.woff") format("woff"), /* Modern Browsers */
|
||||||
|
|||||||
Generated
+26850
-11752
File diff suppressed because it is too large
Load Diff
+83
-63
@@ -1,63 +1,83 @@
|
|||||||
{
|
{
|
||||||
"name": "farmmaps-lib-app",
|
"name": "farmmaps-lib-app",
|
||||||
"version": "0.0.1",
|
"version": "3.0.1",
|
||||||
"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": "ng lint",
|
||||||
"e2e": "ng e2e"
|
"e2e": "ng e2e"
|
||||||
},
|
},
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@angular/animations": "~7.2.0",
|
"@angular/animations": "^14.1.3",
|
||||||
"@angular/common": "~7.2.0",
|
"@angular/common": "^14.1.3",
|
||||||
"@angular/compiler": "~7.2.0",
|
"@angular/compiler": "^14.1.3",
|
||||||
"@angular/core": "~7.2.0",
|
"@angular/core": "^14.1.3",
|
||||||
"@angular/forms": "~7.2.0",
|
"@angular/forms": "^14.1.3",
|
||||||
"@angular/platform-browser": "~7.2.0",
|
"@angular/platform-browser": "^14.1.3",
|
||||||
"@angular/platform-browser-dynamic": "~7.2.0",
|
"@angular/platform-browser-dynamic": "^14.1.3",
|
||||||
"@angular/router": "~7.2.0",
|
"@angular/router": "^14.1.3",
|
||||||
"@aspnet/signalr": "^1.1.4",
|
"@farmmaps/common": "file:dist/common",
|
||||||
"@farmmaps/common": ">=0.0.1-prerelease.77 <0.0.1",
|
"@farmmaps/common-map": "file:dist/common-map",
|
||||||
"@farmmaps/common-map": ">=0.0.1-prerelease.77 <0.0.1",
|
"@farmmaps/common-map3d": "file:dist/common-map3d",
|
||||||
"@ng-bootstrap/ng-bootstrap": "^4.2.1",
|
"@microsoft/signalr": "^3.1.16",
|
||||||
"@ngrx/effects": "^7.2.0",
|
"@ng-bootstrap/ng-bootstrap": "^13.0.0",
|
||||||
"@ngrx/router-store": "^7.2.0",
|
"@ngrx/effects": "^14",
|
||||||
"@ngrx/store": "^7.2.0",
|
"@ngrx/router-store": "^14",
|
||||||
"bootstrap": "^4.3.1",
|
"@ngrx/store": "^14",
|
||||||
"font-awesome": "^4.7.0",
|
"@popperjs/core": "^2.11.6",
|
||||||
"core-js": "^2.5.4",
|
"angular-oauth2-oidc": "^13",
|
||||||
"ngrx-store-localstorage": "^8.0.0",
|
"assert": "^2.0.0",
|
||||||
"resumablejs": "^1.1.0",
|
"bootstrap": "^5.2.0",
|
||||||
"rxjs": "~6.3.3",
|
"browserify-zlib": "^0.2.0",
|
||||||
"tassign": "^1.0.0",
|
"buffer": "^6.0.3",
|
||||||
"zone.js": "~0.8.26"
|
"cesium": "^1.97.0",
|
||||||
},
|
"core-js": "^2.6.12",
|
||||||
"devDependencies": {
|
"https-browserify": "^1.0.0",
|
||||||
"@angular-devkit/build-angular": "~0.13.0",
|
"moment": "^2.29.4",
|
||||||
"@angular-devkit/build-ng-packagr": "~0.13.0",
|
"ngrx-store-localstorage": "^14",
|
||||||
"@angular/cli": "~7.3.8",
|
"ngx-avatar": "^4.1.0",
|
||||||
"@angular/compiler-cli": "~7.2.0",
|
"ngx-clipboard": "^14.0.1",
|
||||||
"@angular/language-service": "~7.2.0",
|
"ngx-image-cropper": "^3.3.5",
|
||||||
"@types/node": "~8.9.4",
|
"ngx-openlayers": "1.0.0-next.19",
|
||||||
"@types/jasmine": "~2.8.8",
|
"ngx-uploadx": "^5.2.0",
|
||||||
"@types/jasminewd2": "~2.0.3",
|
"ol": "6.14.1",
|
||||||
"codelyzer": "~4.5.0",
|
"olcs": "^2.13.1",
|
||||||
"jasmine-core": "~2.99.1",
|
"resumablejs": "^1.1.0",
|
||||||
"jasmine-spec-reporter": "~4.2.1",
|
"rxjs": "^6.6.7",
|
||||||
"karma": "~4.0.0",
|
"stream": "^0.0.2",
|
||||||
"karma-chrome-launcher": "~2.2.0",
|
"stream-http": "^3.2.0",
|
||||||
"karma-coverage-istanbul-reporter": "~2.0.1",
|
"tassign": "^1.0.0",
|
||||||
"karma-jasmine": "~1.1.2",
|
"tslib": "^2.4.0",
|
||||||
"karma-jasmine-html-reporter": "^0.2.2",
|
"url": "^0.11.0",
|
||||||
"ng-packagr": "^4.2.0",
|
"util": "^0.12.4",
|
||||||
"protractor": "~5.4.0",
|
"zone.js": "~0.11.4"
|
||||||
"ts-node": "~7.0.0",
|
},
|
||||||
"tsickle": ">=0.34.0",
|
"devDependencies": {
|
||||||
"tslib": "^1.9.0",
|
"@angular-builders/custom-webpack": "^14",
|
||||||
"tslint": "~5.11.0",
|
"@angular-devkit/build-angular": "^14.1.3",
|
||||||
"typescript": "~3.2.2"
|
"@angular/cli": "^14.1.3",
|
||||||
}
|
"@angular/compiler-cli": "^14.1.3",
|
||||||
}
|
"@angular/language-service": "^14.1.3",
|
||||||
|
"@angular/localize": "^14.1.3",
|
||||||
|
"@types/arcgis-rest-api": "^10.4.5",
|
||||||
|
"@types/jasmine": "~2.8.8",
|
||||||
|
"@types/jasminewd2": "^2.0.9",
|
||||||
|
"@types/node": "^12.20.15",
|
||||||
|
"codelyzer": "^0.0.28",
|
||||||
|
"jasmine-core": "^4.3.0",
|
||||||
|
"jasmine-spec-reporter": "^7.0.0",
|
||||||
|
"karma": "^6.3.20",
|
||||||
|
"karma-chrome-launcher": "~3.1.0",
|
||||||
|
"karma-coverage-istanbul-reporter": "^3.0.3",
|
||||||
|
"karma-jasmine": "^5.1.0",
|
||||||
|
"karma-jasmine-html-reporter": "^2.0.0",
|
||||||
|
"ng-packagr": "^14.1.0",
|
||||||
|
"protractor": "~7.0.0",
|
||||||
|
"ts-node": "^8.8.1",
|
||||||
|
"tslint": "~6.1.0",
|
||||||
|
"typescript": "~4.6.4"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
"lib": {
|
"lib": {
|
||||||
"entryFile": "src/public-api.ts"
|
"entryFile": "src/public-api.ts"
|
||||||
},
|
},
|
||||||
"whitelistedNonPeerDependencies": [
|
"allowedNonPeerDependencies": [
|
||||||
"."
|
"."
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
Generated
+3
-98
@@ -4,105 +4,10 @@
|
|||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@farmmaps/common": {
|
|
||||||
"version": "0.0.1-prerelease.56",
|
|
||||||
"resolved": "https://repository.akkerweb.nl/repository/npm-group/@farmmaps/common/-/common-0.0.1-prerelease.56.tgz",
|
|
||||||
"integrity": "sha512-m9KxWsLkTSz2JI074gIJH1kDR0PCLsFAug8oBjtlU/QxgBySrvqHCRiODpNmNWnFyNTZHqKHJQefn3Q9iAil4g==",
|
|
||||||
"requires": {
|
|
||||||
"angular-oauth2-oidc": "^5.0.2",
|
|
||||||
"ngx-uploadx": "^3.1.3",
|
|
||||||
"tslib": "^1.9.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"angular-oauth2-oidc": {
|
|
||||||
"version": "5.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/angular-oauth2-oidc/-/angular-oauth2-oidc-5.0.2.tgz",
|
|
||||||
"integrity": "sha512-jtOv4IWEjSFfBHVE4seWGWT/ZfWJ95QJ1JaFhVVGJEF64ibGuPwV3ztwTOUl98QHi/Yg4PXXDAisb31JnIbxBw==",
|
|
||||||
"requires": {
|
|
||||||
"jsrsasign": "^8.0.12",
|
|
||||||
"tslib": "^1.9.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ieee754": {
|
|
||||||
"version": "1.1.13",
|
|
||||||
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
|
|
||||||
"integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
|
|
||||||
},
|
|
||||||
"jsrsasign": {
|
|
||||||
"version": "8.0.12",
|
|
||||||
"resolved": "https://registry.npmjs.org/jsrsasign/-/jsrsasign-8.0.12.tgz",
|
|
||||||
"integrity": "sha1-Iqu5ZW00owuVMENnIINeicLlwxY="
|
|
||||||
},
|
|
||||||
"ngx-openlayers": {
|
|
||||||
"version": "1.0.0-next.9",
|
|
||||||
"resolved": "https://registry.npmjs.org/ngx-openlayers/-/ngx-openlayers-1.0.0-next.9.tgz",
|
|
||||||
"integrity": "sha512-14UFxJX9oeOXtq+HJCJyXn0sBmYmCqj2AnFtetKk1FsDe8EUMFGIRju8UOFegCr2oEu5JsuRjALcfW7lCe+teg==",
|
|
||||||
"requires": {
|
|
||||||
"tslib": "^1.9.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ngx-uploadx": {
|
|
||||||
"version": "3.3.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/ngx-uploadx/-/ngx-uploadx-3.3.2.tgz",
|
|
||||||
"integrity": "sha512-gRdXXq2cRU9HE6dj65qay9GV8NRC7n8y5LtMzJWqsfu2k3CHMQxo2TqZwA9/l/PqJ76RoO7sTPy1OenFQ+krkQ==",
|
|
||||||
"requires": {
|
|
||||||
"tslib": "^1.9.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ol": {
|
|
||||||
"version": "5.3.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/ol/-/ol-5.3.3.tgz",
|
|
||||||
"integrity": "sha512-7eU4x8YMduNcED1D5wI+AMWDRe7/1HmGfsbV+kFFROI9RNABU/6n4osj6Q3trZbxxKnK2DSRIjIRGwRHT/Z+Ww==",
|
|
||||||
"requires": {
|
|
||||||
"pbf": "3.1.0",
|
|
||||||
"pixelworks": "1.1.0",
|
|
||||||
"rbush": "2.0.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"pbf": {
|
|
||||||
"version": "3.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/pbf/-/pbf-3.1.0.tgz",
|
|
||||||
"integrity": "sha512-/hYJmIsTmh7fMkHAWWXJ5b8IKLWdjdlAFb3IHkRBn1XUhIYBChVGfVwmHEAV3UfXTxsP/AKfYTXTS/dCPxJd5w==",
|
|
||||||
"requires": {
|
|
||||||
"ieee754": "^1.1.6",
|
|
||||||
"resolve-protobuf-schema": "^2.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"pixelworks": {
|
|
||||||
"version": "1.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/pixelworks/-/pixelworks-1.1.0.tgz",
|
|
||||||
"integrity": "sha1-Hwla1I3Ki/ihyCWOAJIDGkTyLKU="
|
|
||||||
},
|
|
||||||
"protocol-buffers-schema": {
|
|
||||||
"version": "3.3.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.3.2.tgz",
|
|
||||||
"integrity": "sha512-Xdayp8sB/mU+sUV4G7ws8xtYMGdQnxbeIfLjyO9TZZRJdztBGhlmbI5x1qcY4TG5hBkIKGnc28i7nXxaugu88w=="
|
|
||||||
},
|
|
||||||
"quickselect": {
|
|
||||||
"version": "1.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.1.1.tgz",
|
|
||||||
"integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ=="
|
|
||||||
},
|
|
||||||
"rbush": {
|
|
||||||
"version": "2.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.2.tgz",
|
|
||||||
"integrity": "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==",
|
|
||||||
"requires": {
|
|
||||||
"quickselect": "^1.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"resolve-protobuf-schema": {
|
|
||||||
"version": "2.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz",
|
|
||||||
"integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==",
|
|
||||||
"requires": {
|
|
||||||
"protocol-buffers-schema": "^3.3.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tslib": {
|
"tslib": {
|
||||||
"version": "1.10.0",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
|
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz",
|
||||||
"integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
|
"integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ=="
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
{
|
{
|
||||||
"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": ">=14.0.0",
|
||||||
"ngrx-store-localstorage": "^8.0.0",
|
"ngrx-store-localstorage": ">=14.0.0",
|
||||||
"@ngrx/effects": "^7.2",
|
"@ngrx/effects": ">=14.0.0",
|
||||||
"@ngrx/router-store": "^7.2",
|
"@ngrx/router-store":">=14.0.0",
|
||||||
"@ngrx/store": "^7.2",
|
"@ngrx/store":">=14.0.0",
|
||||||
"tassign": "^1.0.0",
|
"tassign": ">=1.0.0",
|
||||||
"@farmmaps/common": ">=0.0.1-prerelease.56 <0.0.1"
|
"ngx-openlayers": ">=1.0.0-next.19",
|
||||||
|
"ol": ">=6.8.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
//$theme-colors: ( "primary": #a7ce39, "secondary": #ffc800 );
|
|
||||||
//$theme-colors: ( "primary": #a7ce39);
|
|
||||||
@@ -1,243 +1,378 @@
|
|||||||
import { Action } from '@ngrx/store';
|
import { Action } from '@ngrx/store';
|
||||||
|
|
||||||
import { IMapState } from '../models/map.state';
|
import { IMapState } from '../models/map.state';
|
||||||
import { IItemLayer } from '../models/item.layer';
|
import { IItemLayer } from '../models/item.layer';
|
||||||
import { IQueryState } from '../models/query.state';
|
import { ILayervalue } from '../models/layer.value';
|
||||||
import { IItem } from '@farmmaps/common';
|
import { IQueryState } from '@farmmaps/common';
|
||||||
import { Feature } from 'ol';
|
import { IItem } from '@farmmaps/common';
|
||||||
import { Extent } from 'ol/extent';
|
import { Feature } from 'ol';
|
||||||
|
import { Style } from 'ol/style';
|
||||||
export const SETSTATE = '[Map] SetState';
|
import { Geometry } from 'ol/geom';
|
||||||
export const SETMAPSTATE = '[Map] MapState';
|
import { IPeriodState } from '../models/period.state';
|
||||||
export const SETVIEWEXTENT = '[Map] SetViewExtent';
|
|
||||||
export const INIT = '[Map] Init';
|
export const SETSTATE = '[Map] SetState';
|
||||||
export const SETPARENT = '[Map] SetParent';
|
export const SETMAPSTATE = '[Map] MapState';
|
||||||
export const STARTSEARCH = '[Map] StartSearch';
|
export const SETVIEWEXTENT = '[Map] SetViewExtent';
|
||||||
export const STARTSEARCHSUCCESS = '[Map] StartSearchSuccess';
|
export const INIT = '[Map] Init';
|
||||||
export const SELECTFEATURE = '[Map] SelectFeature';
|
export const SETPARENT = '[Map] SetParent';
|
||||||
export const SELECTITEM = '[Map] SelectItem';
|
export const SETPERIOD = '[Map] SetPeriod';
|
||||||
export const SELECTITEMSUCCESS = '[Map] SelectItemSuccess';
|
export const STARTSEARCH = '[Map] StartSearch';
|
||||||
export const ADDFEATURESUCCESS = '[Map] AddFeatureSuccess';
|
export const STARTSEARCHSUCCESS = '[Map] StartSearchSuccess';
|
||||||
export const UPDATEFEATURESUCCESS = '[Map] UpdateFeatureSuccess';
|
export const SELECTFEATURE = '[Map] SelectFeature';
|
||||||
export const EXPANDSEARCH = '[Map] ExpandSearch';
|
export const SELECTITEM = '[Map] SelectItem';
|
||||||
export const COLLAPSESEARCH = '[Map] CollapseSearch';
|
export const SELECTITEMSUCCESS = '[Map] SelectItemSuccess';
|
||||||
export const TOGGLEMENU = '[Map] ToggleMenu';
|
export const SETSELECTEDITEMLAYER = '[Map] SetSelectedItemLayer';
|
||||||
export const SETEXTENT = '[Map] SetExtent';
|
export const SELECTTEMPORALITEMSSUCCESS = '[Map] SelectTemporalItemsSuccess';
|
||||||
export const SETQUERYSTATE = '[Map] SetQueryState';
|
export const NEXTTEMPORAL = '[Map] NextTemporal';
|
||||||
export const SETTIMESPAN = '[Map] SetTimeSpan';
|
export const PREVIOUSTEMPORAL = '[Map] PreviousTemporal';
|
||||||
export const ADDLAYER = '[Map] AddLayer';
|
export const SELECTTEMPORAL = '[Map] SelectTemporal';
|
||||||
export const SETVISIBILITY = '[Map] SetVisibility';
|
export const ADDFEATURESUCCESS = '[Map] AddFeatureSuccess';
|
||||||
export const SETOPACITY = '[Map] SetOpacity';
|
export const UPDATEFEATURESUCCESS = '[Map] UpdateFeatureSuccess';
|
||||||
export const SETLAYERINDEX = '[Map] SetLayerIndex';
|
export const EXPANDSEARCH = '[Map] ExpandSearch';
|
||||||
export const REMOVELAYER = '[Map] RemoveLayer';
|
export const COLLAPSESEARCH = '[Map] CollapseSearch';
|
||||||
export const LOADBASELAYERS = '[Map] LoadLayers';
|
export const SETEXTENT = '[Map] SetExtent';
|
||||||
export const LOADBASELAYERSSUCCESS = '[Map] LoadLayersSuccess';
|
export const SETQUERYSTATE = '[Map] SetQueryState';
|
||||||
export const SELECTBASELAYER = '[Map] SelectBaseLayers';
|
export const SETTIMESPAN = '[Map] SetTimeSpan';
|
||||||
export const SELECTOVERLAYLAYER = '[Map] SelectOverlayLayers';
|
export const ADDLAYER = '[Map] AddLayer';
|
||||||
export const ZOOMTOEXTENT = '[Map] ZoomToExtent';
|
export const SETVISIBILITY = '[Map] SetVisibility';
|
||||||
export const DOQUERY = '[Map] DoQuery';
|
export const SETOPACITY = '[Map] SetOpacity';
|
||||||
|
export const SETLAYERINDEX = '[Map] SetLayerIndex';
|
||||||
export class SetState implements Action {
|
export const REMOVELAYER = '[Map] RemoveLayer';
|
||||||
readonly type = SETSTATE;
|
export const CLEARLAYERS = '[Map] ClearLayers';
|
||||||
|
export const LOADBASELAYERS = '[Map] LoadLayers';
|
||||||
constructor(public mapState: IMapState,public queryState:IQueryState) { }
|
export const LOADBASELAYERSSUCCESS = '[Map] LoadLayersSuccess';
|
||||||
}
|
export const SELECTBASELAYER = '[Map] SelectBaseLayers';
|
||||||
|
export const SELECTOVERLAYLAYER = '[Map] SelectOverlayLayers';
|
||||||
export class SetMapState implements Action {
|
export const ZOOMTOEXTENT = '[Map] ZoomToExtent';
|
||||||
readonly type = SETMAPSTATE;
|
export const DOQUERY = '[Map] DoQuery';
|
||||||
|
export const SETSTYLE = '[Map] SetStyle';
|
||||||
constructor(public mapState: IMapState) { }
|
export const SHOWLAYERSWITCHER = '[Map] ShowLayerSwitcher';
|
||||||
}
|
export const CLEAR = '[Map] Clear';
|
||||||
|
export const SETREPLACEURL = '[Map] SetReplaceUrl';
|
||||||
export class SetViewExtent implements Action {
|
export const SETFEATURES = '[Map] SetFeatures'
|
||||||
readonly type = SETVIEWEXTENT;
|
export const SETLAYERVALUESLOCATION = '[Map] SetLayerValuesLocation'
|
||||||
|
export const TOGGLELAYERVALUESENABLED = '[Map] ToggleLayerValuesEnabled'
|
||||||
constructor(public extent:number[]) { }
|
export const GETLAYERVALUE = '[Map] GetLayerValue'
|
||||||
}
|
export const GETLAYERVALUESUCCESS = '[Map] GetLayerValueSuccess'
|
||||||
|
export const TOGGLESHOWDATALAYERSLIDE = '[Map] ToggleShowDataLayerSlide'
|
||||||
export class Init implements Action {
|
export const SETVIEWSTATE = '[Map] SetViewState'
|
||||||
readonly type = INIT;
|
|
||||||
|
|
||||||
constructor() { }
|
export class Clear implements Action {
|
||||||
}
|
readonly type = CLEAR;
|
||||||
|
constructor() {}
|
||||||
export class SetParent implements Action {
|
}
|
||||||
readonly type = SETPARENT;
|
|
||||||
|
export class SetState implements Action {
|
||||||
constructor(public parentCode:string) { }
|
readonly type = SETSTATE;
|
||||||
}
|
|
||||||
|
constructor(public mapState: IMapState,public queryState:IQueryState) { }
|
||||||
export class StartSearch implements Action {
|
}
|
||||||
readonly type = STARTSEARCH;
|
|
||||||
|
export class SetMapState implements Action {
|
||||||
constructor(public queryState: IQueryState) { }
|
readonly type = SETMAPSTATE;
|
||||||
}
|
|
||||||
|
constructor(public mapState: IMapState) { }
|
||||||
export class StartSearchSuccess implements Action {
|
}
|
||||||
readonly type = STARTSEARCHSUCCESS;
|
|
||||||
|
export class SetViewExtent implements Action {
|
||||||
constructor(public features: Array<Feature>, public query:IQueryState) { }
|
readonly type = SETVIEWEXTENT;
|
||||||
}
|
|
||||||
|
constructor(public extent:number[]) { }
|
||||||
export class SelectFeature implements Action {
|
}
|
||||||
readonly type = SELECTFEATURE;
|
|
||||||
|
export class Init implements Action {
|
||||||
constructor(public feature:Feature) { }
|
readonly type = INIT;
|
||||||
}
|
|
||||||
|
constructor() { }
|
||||||
export class SelectItem implements Action {
|
}
|
||||||
readonly type = SELECTITEM;
|
|
||||||
|
export class SetParent implements Action {
|
||||||
constructor(public itemCode:string) { }
|
readonly type = SETPARENT;
|
||||||
}
|
|
||||||
|
constructor(public parentCode:string) { }
|
||||||
export class SelectItemSuccess implements Action {
|
}
|
||||||
readonly type = SELECTITEMSUCCESS;
|
|
||||||
|
export class SetPeriod implements Action {
|
||||||
constructor(public item: IItem) { }
|
readonly type = SETPERIOD;
|
||||||
}
|
|
||||||
|
constructor(public period:IPeriodState) { }
|
||||||
export class AddFeatureSuccess implements Action {
|
}
|
||||||
readonly type = ADDFEATURESUCCESS;
|
|
||||||
|
export class StartSearch implements Action {
|
||||||
constructor(public feature: Feature) { }
|
readonly type = STARTSEARCH;
|
||||||
}
|
|
||||||
|
constructor(public queryState: IQueryState) { }
|
||||||
export class UpdateFeatureSuccess implements Action {
|
}
|
||||||
readonly type = UPDATEFEATURESUCCESS;
|
|
||||||
|
export class StartSearchSuccess implements Action {
|
||||||
constructor(public feature: Feature) { }
|
readonly type = STARTSEARCHSUCCESS;
|
||||||
}
|
|
||||||
|
constructor(public features: Array<Feature<Geometry>>, public query:IQueryState) { }
|
||||||
export class ExpandSearch implements Action {
|
}
|
||||||
readonly type = EXPANDSEARCH;
|
|
||||||
|
export class SelectFeature implements Action {
|
||||||
constructor() { }
|
readonly type = SELECTFEATURE;
|
||||||
}
|
|
||||||
|
constructor(public feature:Feature<Geometry>) { }
|
||||||
export class CollapseSearch implements Action {
|
}
|
||||||
readonly type = COLLAPSESEARCH;
|
|
||||||
|
export class SelectItem implements Action {
|
||||||
constructor() { }
|
readonly type = SELECTITEM;
|
||||||
}
|
|
||||||
|
constructor(public itemCode:string) { }
|
||||||
export class ToggleMenu implements Action {
|
}
|
||||||
readonly type = TOGGLEMENU;
|
|
||||||
|
export class SelectItemSuccess implements Action {
|
||||||
constructor() { }
|
readonly type = SELECTITEMSUCCESS;
|
||||||
}
|
|
||||||
|
constructor(public item: IItem, public parentItem: IItem) { }
|
||||||
export class SetExtent implements Action {
|
}
|
||||||
readonly type = SETEXTENT;
|
|
||||||
|
export class SelectTemporalItemsSuccess implements Action {
|
||||||
constructor(public extent:number[]) { }
|
readonly type = SELECTTEMPORALITEMSSUCCESS;
|
||||||
}
|
|
||||||
|
constructor(public temporalItems: IItem[]) { }
|
||||||
export class SetQueryState implements Action {
|
}
|
||||||
readonly type = SETQUERYSTATE;
|
|
||||||
|
export class NextTemporal implements Action {
|
||||||
constructor(public queryState: IQueryState) { }
|
readonly type = NEXTTEMPORAL;
|
||||||
}
|
|
||||||
|
constructor() { }
|
||||||
export class SetTimeSpan implements Action {
|
}
|
||||||
readonly type = SETTIMESPAN;
|
|
||||||
|
export class PreviousTemporal implements Action {
|
||||||
constructor(public startDate: Date, public endDate: Date) { }
|
readonly type = PREVIOUSTEMPORAL;
|
||||||
}
|
|
||||||
|
constructor() { }
|
||||||
export class AddLayer implements Action {
|
}
|
||||||
readonly type = ADDLAYER;
|
|
||||||
|
export class SelectTemporal implements Action {
|
||||||
constructor(public item:IItem,public layerIndex=-1) { }
|
readonly type = SELECTTEMPORAL;
|
||||||
}
|
|
||||||
|
constructor(item:IItem) { }
|
||||||
export class SetVisibility implements Action {
|
}
|
||||||
readonly type = SETVISIBILITY;
|
|
||||||
|
export class AddFeatureSuccess implements Action {
|
||||||
constructor(public itemLayer:IItemLayer,public visibility:boolean) { }
|
readonly type = ADDFEATURESUCCESS;
|
||||||
}
|
|
||||||
|
constructor(public feature: Feature<Geometry>) { }
|
||||||
export class SetOpacity implements Action {
|
}
|
||||||
readonly type = SETOPACITY;
|
|
||||||
|
export class UpdateFeatureSuccess implements Action {
|
||||||
constructor(public itemLayer: IItemLayer, public opacity: number) { }
|
readonly type = UPDATEFEATURESUCCESS;
|
||||||
}
|
|
||||||
|
constructor(public feature: Feature<Geometry>) { }
|
||||||
export class SetLayerIndex implements Action {
|
}
|
||||||
readonly type = SETLAYERINDEX;
|
|
||||||
|
export class ExpandSearch implements Action {
|
||||||
constructor(public layerIndex: number, public itemLayer: IItemLayer = null) { }
|
readonly type = EXPANDSEARCH;
|
||||||
}
|
|
||||||
|
constructor() { }
|
||||||
export class RemoveLayer implements Action {
|
}
|
||||||
readonly type = REMOVELAYER;
|
|
||||||
|
export class CollapseSearch implements Action {
|
||||||
constructor(public itemLayer: IItemLayer) { }
|
readonly type = COLLAPSESEARCH;
|
||||||
}
|
|
||||||
|
constructor() { }
|
||||||
export class LoadBaseLayers implements Action {
|
}
|
||||||
readonly type = LOADBASELAYERS;
|
|
||||||
|
export class SetExtent implements Action {
|
||||||
constructor(public projection: string) { }
|
readonly type = SETEXTENT;
|
||||||
}
|
|
||||||
|
constructor(public extent:number[]) { }
|
||||||
export class LoadBaseLayersSuccess implements Action {
|
}
|
||||||
readonly type = LOADBASELAYERSSUCCESS;
|
|
||||||
|
export class SetQueryState implements Action {
|
||||||
constructor(public items: IItem[] ) { }
|
readonly type = SETQUERYSTATE;
|
||||||
}
|
|
||||||
|
constructor(public queryState: IQueryState,public replaceUrl:boolean = true) { }
|
||||||
export class SelectBaseLayer implements Action {
|
}
|
||||||
readonly type = SELECTBASELAYER;
|
|
||||||
|
export class SetTimeSpan implements Action {
|
||||||
constructor(public itemLayer: IItemLayer) { }
|
readonly type = SETTIMESPAN;
|
||||||
}
|
|
||||||
|
constructor(public startDate: Date, public endDate: Date) { }
|
||||||
export class SelectOverlayLayer implements Action {
|
}
|
||||||
readonly type = SELECTOVERLAYLAYER;
|
|
||||||
|
export class AddLayer implements Action {
|
||||||
constructor(public itemLayer: IItemLayer) { }
|
readonly type = ADDLAYER;
|
||||||
}
|
|
||||||
|
constructor(public item:IItem,public layerIndex=-1) { }
|
||||||
export class ZoomToExtent implements Action {
|
}
|
||||||
readonly type = ZOOMTOEXTENT;
|
|
||||||
|
export class SetSelectedItemLayer implements Action {
|
||||||
constructor(public itemLayer: IItemLayer) { }
|
readonly type = SETSELECTEDITEMLAYER;
|
||||||
}
|
|
||||||
|
constructor(public item:IItem,public layerIndex=-1) { }
|
||||||
export class DoQuery implements Action {
|
}
|
||||||
readonly type = DOQUERY;
|
|
||||||
|
export class SetVisibility implements Action {
|
||||||
constructor(public query:IQueryState) { }
|
readonly type = SETVISIBILITY;
|
||||||
}
|
|
||||||
|
constructor(public itemLayer:IItemLayer,public visibility:boolean) { }
|
||||||
export type Actions = SetMapState
|
}
|
||||||
| Init
|
|
||||||
| SetParent
|
export class SetOpacity implements Action {
|
||||||
| StartSearch
|
readonly type = SETOPACITY;
|
||||||
| StartSearchSuccess
|
|
||||||
| SelectFeature
|
constructor(public itemLayer: IItemLayer, public opacity: number) { }
|
||||||
| SelectItem
|
}
|
||||||
| SelectItemSuccess
|
|
||||||
| AddFeatureSuccess
|
export class SetLayerIndex implements Action {
|
||||||
| UpdateFeatureSuccess
|
readonly type = SETLAYERINDEX;
|
||||||
| ExpandSearch
|
|
||||||
| CollapseSearch
|
constructor(public layerIndex: number, public itemLayer: IItemLayer = null) { }
|
||||||
| ToggleMenu
|
}
|
||||||
| SetExtent
|
|
||||||
| SetQueryState
|
export class RemoveLayer implements Action {
|
||||||
| SetTimeSpan
|
readonly type = REMOVELAYER;
|
||||||
| AddLayer
|
|
||||||
| RemoveLayer
|
constructor(public itemLayer: IItemLayer) { }
|
||||||
| SetVisibility
|
}
|
||||||
| SetOpacity
|
|
||||||
| SetLayerIndex
|
export class ClearLayers implements Action {
|
||||||
| LoadBaseLayers
|
readonly type = CLEARLAYERS;
|
||||||
| LoadBaseLayersSuccess
|
|
||||||
| SelectBaseLayer
|
constructor() { }
|
||||||
| SelectOverlayLayer
|
}
|
||||||
| ZoomToExtent
|
|
||||||
| SetState
|
export class LoadBaseLayers implements Action {
|
||||||
| SetViewExtent
|
readonly type = LOADBASELAYERS;
|
||||||
| DoQuery;
|
|
||||||
|
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>>) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
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 type Actions = SetMapState
|
||||||
|
| Init
|
||||||
|
| Clear
|
||||||
|
| SetParent
|
||||||
|
| StartSearch
|
||||||
|
| StartSearchSuccess
|
||||||
|
| 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;
|
||||||
|
|
||||||
|
|||||||
@@ -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 { }
|
||||||
|
|||||||
@@ -18,14 +18,12 @@ import * as mapEffects from './effects/map.effects';
|
|||||||
|
|
||||||
import { IMapState} from './models/map.state';
|
import { IMapState} from './models/map.state';
|
||||||
import { ISelectedFeatures } from './models/selected.features';
|
import { ISelectedFeatures } from './models/selected.features';
|
||||||
import { IItemLayer } from './models/item.layer';
|
import { IItemLayer,ItemLayer,ITemporalItemLayer,TemporalItemLayer } from './models/item.layer';
|
||||||
import { ItemLayer} from './models/item.layer';
|
import { IClickedFeature } from './models/clicked.feature';
|
||||||
import { IQueryState } from './models/query.state';
|
|
||||||
import { IPeriodState } from './models/period.state';
|
import { IPeriodState } from './models/period.state';
|
||||||
|
|
||||||
// components
|
// components
|
||||||
import { GpsLocation} from './components/aol/gps-location/gps-location.component';
|
import { GpsLocation} from './components/aol/gps-location/gps-location.component';
|
||||||
//import {Switch2D3DComponent } from './components/aol/switch2d3d/switch2d3d.component';
|
|
||||||
import {FeatureListFeatureCropfieldComponent } from './components/feature-list-feature-cropfield/feature-list-feature-cropfield.component';
|
import {FeatureListFeatureCropfieldComponent } from './components/feature-list-feature-cropfield/feature-list-feature-cropfield.component';
|
||||||
import { FeatureListFeatureCroppingschemeComponent} from './components/feature-list-feature-croppingscheme/feature-list-feature-croppingscheme.component';
|
import { FeatureListFeatureCroppingschemeComponent} from './components/feature-list-feature-croppingscheme/feature-list-feature-croppingscheme.component';
|
||||||
import { ItemWidgetListComponent} from './components/item-widget-list/item-widget-list.component';
|
import { ItemWidgetListComponent} from './components/item-widget-list/item-widget-list.component';
|
||||||
@@ -35,6 +33,7 @@ import { AbstractItemListComponent,ItemListComponent} from './components/item-li
|
|||||||
import { AbstractSelectedItemComponent, SelectedItemComponent } from './components/selected-item/selected-item.component';
|
import { AbstractSelectedItemComponent, SelectedItemComponent } from './components/selected-item/selected-item.component';
|
||||||
import { SelectedItemCropfieldComponent } from './components/selected-item-cropfield/selected-item-cropfield.component';
|
import { SelectedItemCropfieldComponent } from './components/selected-item-cropfield/selected-item-cropfield.component';
|
||||||
import { SelectedItemGeotiffComponent } from './components/selected-item-geotiff/selected-item-geotiff.component';
|
import { SelectedItemGeotiffComponent } from './components/selected-item-geotiff/selected-item-geotiff.component';
|
||||||
|
import { SelectedItemTemporalComponent} from './components/selected-item-temporal/selected-item-temporal.component';
|
||||||
import {SelectedItemShapeComponent } from './components/selected-item-shape/selected-item-shape.component';
|
import {SelectedItemShapeComponent } from './components/selected-item-shape/selected-item-shape.component';
|
||||||
import { SelectedItemContainerComponent } from './components/selected-item-container/selected-item-container.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 { AbstractFeatureListFeatureComponent, FeatureListFeatureComponent } from './components/feature-list-feature/feature-list-feature.component';
|
||||||
@@ -46,7 +45,6 @@ import { WidgetHostDirective} from './components/widget-host/widget-host.directi
|
|||||||
import { FeatureListComponent,AbstractFeatureListComponent} from './components/feature-list/feature-list.component';
|
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 { ItemVectorSourceComponent } from './components/aol/item-vector-source/item-vector-source.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 { ZoomToExtentComponent } from './components/aol/zoom-to-extent/zoom-to-extent.component';
|
||||||
import { RotationResetComponent } from './components/aol/rotation-reset/rotation-reset.component';
|
import { RotationResetComponent } from './components/aol/rotation-reset/rotation-reset.component';
|
||||||
@@ -58,14 +56,52 @@ import { MapSearchComponent } from './components/map-search/map-search.component
|
|||||||
import { MapRoutingModule } from './common-map-routing.module';
|
import { MapRoutingModule } from './common-map-routing.module';
|
||||||
import { LegendComponent } from './components/legend/legend.component';
|
import { LegendComponent } from './components/legend/legend.component';
|
||||||
import { LayerVectorImageComponent } from './components/aol/layer-vector-image/layer-vector-image.component';
|
import { LayerVectorImageComponent } from './components/aol/layer-vector-image/layer-vector-image.component';
|
||||||
import { StateSerializerService } from './services/state-serializer.service';
|
import {FeatureIconService} from './services/feature-icon.service';
|
||||||
import { GeolocationService } from './services/geolocation.service';
|
import { GeolocationService } from './services/geolocation.service';
|
||||||
import { localStorageSync } from 'ngrx-store-localstorage';
|
import {DeviceOrientationService} from './services/device-orientation.service';
|
||||||
|
import { TemporalService} from './services/temporal.service';
|
||||||
import { WidgetStatusComponent } from './components/widget-status/widget-status.component';
|
import { WidgetStatusComponent } from './components/widget-status/widget-status.component';
|
||||||
import { ForChild} from './components/for-item/for-child.decorator';
|
import { ForChild} from './components/for-item/for-child.decorator';
|
||||||
import {ForItemType } from './components/for-item/for-itemtype.decorator';
|
import {ForItemType } from './components/for-item/for-itemtype.decorator';
|
||||||
import { ForSourceTask} from './components/for-item/for-sourcetask.decorator';
|
import { ForSourceTask} from './components/for-item/for-sourcetask.decorator';
|
||||||
|
import { ForPackage } from './components/for-item/for-package.decorator';
|
||||||
|
import { PanToLocation} from './components/aol/pan-to-location/pan-to-location.component';
|
||||||
|
import {LayerSwitcher} from './components/layer-switcher/layer-switcher.component';
|
||||||
|
import {HistogramDetailsComponent} from './components/legend/histogram-details/histogram-details.component';
|
||||||
|
import {StatisticsDetailsComponent} from './components/legend/statistics-details/statistics-details.component';
|
||||||
|
import { ifZoomToShowDirective} from './components/if-zoom-to-show/if-zoom-to-show.directive';
|
||||||
|
import { ZoomToShowAlert} from './components/zoom-to-show-alert/zoom-to-show-alert.component';
|
||||||
|
import { LayerValuesComponent } from './components/aol/layer-values/layer-values.component';
|
||||||
|
import { GeometryThumbnailComponent } from './components/feature-thumbnail/feature-thumbnail.component';
|
||||||
|
|
||||||
|
export function LocalStorageSync(reducer: ActionReducer<any>): ActionReducer<any> {
|
||||||
|
const r = function(state, action) {
|
||||||
|
const r2 = reducer(state, action);
|
||||||
|
|
||||||
|
if(action.type == "@ngrx/store/update-reducers") {
|
||||||
|
let ms = window.localStorage.getItem(MODULE_NAME+"_mapState");
|
||||||
|
if(ms) {
|
||||||
|
r2["mapState"] = JSON.parse(ms);
|
||||||
|
}
|
||||||
|
let sp = window.localStorage.getItem(MODULE_NAME+"_searchPeriod");
|
||||||
|
if(sp) {
|
||||||
|
let 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,
|
mapEffects,
|
||||||
@@ -73,7 +109,6 @@ export {
|
|||||||
mapActions,
|
mapActions,
|
||||||
ZoomToExtentComponent,
|
ZoomToExtentComponent,
|
||||||
ItemVectorSourceComponent,
|
ItemVectorSourceComponent,
|
||||||
ItemFeaturesSourceComponent,
|
|
||||||
ItemLayersComponent,
|
ItemLayersComponent,
|
||||||
FileDropTargetComponent,
|
FileDropTargetComponent,
|
||||||
MapComponent,
|
MapComponent,
|
||||||
@@ -97,6 +132,7 @@ export {
|
|||||||
SelectedItemComponent,
|
SelectedItemComponent,
|
||||||
SelectedItemCropfieldComponent,
|
SelectedItemCropfieldComponent,
|
||||||
SelectedItemGeotiffComponent,
|
SelectedItemGeotiffComponent,
|
||||||
|
SelectedItemTemporalComponent,
|
||||||
SelectedItemShapeComponent,
|
SelectedItemShapeComponent,
|
||||||
ItemListItemComponent,
|
ItemListItemComponent,
|
||||||
ItemListItemContainerComponent,
|
ItemListItemContainerComponent,
|
||||||
@@ -104,142 +140,150 @@ export {
|
|||||||
ItemWidgetListComponent,
|
ItemWidgetListComponent,
|
||||||
WidgetStatusComponent,
|
WidgetStatusComponent,
|
||||||
GpsLocation,
|
GpsLocation,
|
||||||
|
PanToLocation,
|
||||||
|
LayerSwitcher,
|
||||||
AbstractFeatureListComponent,
|
AbstractFeatureListComponent,
|
||||||
AbstractFeatureListFeatureComponent,
|
AbstractFeatureListFeatureComponent,
|
||||||
AbstractSelectedItemComponent,
|
AbstractSelectedItemComponent,
|
||||||
AbstractItemWidgetComponent,
|
AbstractItemWidgetComponent,
|
||||||
AbstractItemListItemComponent,
|
AbstractItemListItemComponent,
|
||||||
AbstractItemListComponent,
|
AbstractItemListComponent,
|
||||||
StateSerializerService,
|
FeatureIconService,
|
||||||
GeolocationService,
|
GeolocationService,
|
||||||
|
DeviceOrientationService,
|
||||||
|
TemporalService,
|
||||||
IMapState,
|
IMapState,
|
||||||
ISelectedFeatures,
|
ISelectedFeatures,
|
||||||
IItemLayer,
|
IItemLayer,
|
||||||
ItemLayer,
|
ItemLayer,
|
||||||
IQueryState,
|
|
||||||
IPeriodState,
|
IPeriodState,
|
||||||
ForChild,
|
ForChild,
|
||||||
ForItemType,
|
ForItemType,
|
||||||
ForSourceTask
|
ForSourceTask,
|
||||||
|
ForPackage ,
|
||||||
|
ITemporalItemLayer,
|
||||||
|
TemporalItemLayer,
|
||||||
|
ifZoomToShowDirective,
|
||||||
|
ZoomToShowAlert,
|
||||||
|
IClickedFeature,
|
||||||
|
GeometryThumbnailComponent
|
||||||
}
|
}
|
||||||
|
|
||||||
@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,
|
FeatureListFeatureContainerComponent,
|
||||||
FeatureListFeatureContainerComponent,
|
FeatureListFeatureComponent,
|
||||||
FeatureListFeatureComponent,
|
FeatureListFeatureCroppingschemeComponent,
|
||||||
FeatureListFeatureCroppingschemeComponent,
|
FeatureListFeatureCropfieldComponent,
|
||||||
FeatureListFeatureCropfieldComponent,
|
SelectedItemContainerComponent,
|
||||||
SelectedItemContainerComponent,
|
SelectedItemComponent,
|
||||||
SelectedItemComponent,
|
SelectedItemCropfieldComponent,
|
||||||
SelectedItemCropfieldComponent,
|
SelectedItemGeotiffComponent,
|
||||||
SelectedItemGeotiffComponent,
|
SelectedItemTemporalComponent,
|
||||||
SelectedItemShapeComponent,
|
SelectedItemShapeComponent,
|
||||||
ItemListItemComponent,
|
ItemListItemComponent,
|
||||||
ItemListItemContainerComponent,
|
ItemListItemContainerComponent,
|
||||||
ItemListComponent,
|
ItemListComponent,
|
||||||
ItemWidgetListComponent,
|
ItemWidgetListComponent,
|
||||||
WidgetStatusComponent,
|
WidgetStatusComponent,
|
||||||
GpsLocation,
|
GpsLocation,
|
||||||
],
|
PanToLocation,
|
||||||
entryComponents: [
|
LayerSwitcher,
|
||||||
FeatureListComponent,
|
HistogramDetailsComponent,
|
||||||
FeatureListCroppingschemeComponent,
|
StatisticsDetailsComponent,
|
||||||
FeatureListCropfieldComponent,
|
ifZoomToShowDirective,
|
||||||
FeatureListFeatureComponent,
|
ZoomToShowAlert,
|
||||||
FeatureListFeatureCroppingschemeComponent,
|
LayerValuesComponent,
|
||||||
FeatureListFeatureCropfieldComponent,
|
GeometryThumbnailComponent
|
||||||
SelectedItemComponent,
|
],
|
||||||
SelectedItemCropfieldComponent,
|
exports: [
|
||||||
SelectedItemGeotiffComponent,
|
ItemVectorSourceComponent,
|
||||||
SelectedItemShapeComponent,
|
ItemLayersComponent,
|
||||||
ItemListComponent,
|
FileDropTargetComponent,
|
||||||
ItemListItemComponent,
|
MetaDataModalComponent,
|
||||||
],
|
MapComponent,
|
||||||
exports: [
|
GpsLocation,
|
||||||
ItemVectorSourceComponent,
|
PanToLocation,
|
||||||
ItemFeaturesSourceComponent,
|
LayerSwitcher,
|
||||||
ItemLayersComponent,
|
FeatureListFeatureComponent,
|
||||||
FileDropTargetComponent,
|
FeatureListFeatureCropfieldComponent,
|
||||||
MetaDataModalComponent,
|
FeatureListFeatureCroppingschemeComponent,
|
||||||
MapComponent,
|
SelectedItemContainerComponent,
|
||||||
GpsLocation,
|
SelectedItemComponent,
|
||||||
FeatureListFeatureComponent,
|
SelectedItemCropfieldComponent,
|
||||||
FeatureListFeatureCropfieldComponent,
|
SelectedItemGeotiffComponent,
|
||||||
FeatureListFeatureCroppingschemeComponent,
|
SelectedItemTemporalComponent,
|
||||||
SelectedItemContainerComponent,
|
SelectedItemShapeComponent,
|
||||||
SelectedItemComponent,
|
ItemListItemComponent,
|
||||||
SelectedItemCropfieldComponent,
|
ItemListItemContainerComponent,
|
||||||
SelectedItemGeotiffComponent,
|
ItemListComponent,
|
||||||
SelectedItemShapeComponent,
|
ItemWidgetListComponent,
|
||||||
ItemListItemComponent,
|
WidgetStatusComponent,
|
||||||
ItemListItemContainerComponent,
|
RotationResetComponent,
|
||||||
ItemListComponent,
|
MapSearchComponent,
|
||||||
ItemWidgetListComponent,
|
SelectPeriodModalComponent,
|
||||||
WidgetStatusComponent,
|
LayerListComponent,
|
||||||
RotationResetComponent,
|
LegendComponent,
|
||||||
MapSearchComponent,
|
LayerVectorImageComponent,
|
||||||
SelectPeriodModalComponent,
|
FeatureListComponent,
|
||||||
LayerListComponent,
|
WidgetHostDirective,
|
||||||
LegendComponent,
|
FeatureListContainerComponent,
|
||||||
LayerVectorImageComponent,
|
FeatureListCroppingschemeComponent,
|
||||||
FeatureListComponent,
|
FeatureListCropfieldComponent,
|
||||||
WidgetHostDirective,
|
FeatureListFeatureContainerComponent,
|
||||||
FeatureListContainerComponent,
|
ZoomToExtentComponent,
|
||||||
FeatureListCroppingschemeComponent,
|
ifZoomToShowDirective,
|
||||||
FeatureListCropfieldComponent,
|
ZoomToShowAlert,
|
||||||
FeatureListFeatureContainerComponent,
|
GeometryThumbnailComponent
|
||||||
ZoomToExtentComponent
|
],
|
||||||
]
|
providers: [
|
||||||
|
FeatureIconService,
|
||||||
|
GeolocationService,
|
||||||
|
DeviceOrientationService,
|
||||||
|
TemporalService,
|
||||||
|
{ provide: AbstractFeatureListComponent, useClass: FeatureListCroppingschemeComponent, multi: true },
|
||||||
|
{ provide: AbstractFeatureListComponent, useClass: FeatureListCropfieldComponent, multi: true },
|
||||||
|
{ provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureComponent, multi: true },
|
||||||
|
{ provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureCroppingschemeComponent, multi: true },
|
||||||
|
{ provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureCropfieldComponent, multi: true },
|
||||||
|
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemComponent, multi: true },
|
||||||
|
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemCropfieldComponent, multi: true },
|
||||||
|
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemGeotiffComponent, multi: true },
|
||||||
|
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemTemporalComponent, multi: true },
|
||||||
|
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemShapeComponent, multi: true },
|
||||||
|
{ provide: AbstractItemListItemComponent, useClass: ItemListItemComponent, multi: true },
|
||||||
|
{ provide: AbstractItemListComponent, useClass: ItemListComponent, multi: true }
|
||||||
|
]
|
||||||
})
|
})
|
||||||
|
|
||||||
export class AppCommonMapModule {
|
|
||||||
static forRoot(): ModuleWithProviders {
|
export class AppCommonMapModule {
|
||||||
return {
|
|
||||||
ngModule: AppCommonMapModule,
|
|
||||||
providers: [
|
|
||||||
StateSerializerService,
|
|
||||||
GeolocationService,
|
|
||||||
{ provide: AbstractFeatureListComponent, useClass: FeatureListCroppingschemeComponent, multi: true },
|
|
||||||
{ provide: AbstractFeatureListComponent, useClass: FeatureListCropfieldComponent, multi: true },
|
|
||||||
{ provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureComponent, multi: true },
|
|
||||||
{ provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureCroppingschemeComponent, multi: true },
|
|
||||||
{ provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureCropfieldComponent, multi: true },
|
|
||||||
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemComponent, multi: true },
|
|
||||||
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemCropfieldComponent, multi: true },
|
|
||||||
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemGeotiffComponent, multi: true },
|
|
||||||
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemShapeComponent, multi: true },
|
|
||||||
{ provide: AbstractItemListItemComponent, useClass: ItemListItemComponent, multi: true },
|
|
||||||
{ provide: AbstractItemListComponent, useClass: ItemListComponent, multi: true }
|
|
||||||
]
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -4,7 +4,7 @@ import { MapComponent } from 'ngx-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,
|
||||||
@@ -21,7 +21,7 @@ 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) {
|
||||||
}
|
}
|
||||||
|
|||||||
+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
-6
@@ -1,4 +1,3 @@
|
|||||||
@import "../../../_theme.scss";
|
|
||||||
@import "~bootstrap/scss/bootstrap.scss";
|
@import "~bootstrap/scss/bootstrap.scss";
|
||||||
|
|
||||||
|
|
||||||
@@ -10,26 +9,34 @@
|
|||||||
stroke-width: 0;
|
stroke-width: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.heading.hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
.tolerance {
|
.tolerance {
|
||||||
fill: theme-color();
|
fill: $primary;
|
||||||
fill-opacity:0.4;
|
fill-opacity:0.4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tolerance.hidden {
|
||||||
|
display: none
|
||||||
|
}
|
||||||
|
|
||||||
.border {
|
.border {
|
||||||
fill: white;
|
fill: $white;
|
||||||
}
|
}
|
||||||
|
|
||||||
.center {
|
.center {
|
||||||
fill: theme-color();
|
fill: $primary;
|
||||||
}
|
}
|
||||||
|
|
||||||
.stop1 {
|
.stop1 {
|
||||||
stop-color: theme-color();
|
stop-color: $primary;
|
||||||
stop-opacity:1;
|
stop-opacity:1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.stop2 {
|
.stop2 {
|
||||||
stop-color: theme-color();
|
stop-color:$primary;
|
||||||
stop-opacity: 0;
|
stop-opacity: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+75
-68
@@ -1,68 +1,75 @@
|
|||||||
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 'ngx-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']
|
||||||
})
|
})
|
||||||
export class GpsLocation implements OnInit,OnChanges{
|
export class GpsLocation implements OnInit,OnChanges{
|
||||||
|
|
||||||
@Input() enable:boolean;
|
@Input() enable:boolean;
|
||||||
public instance: Overlay;
|
public instance: Overlay;
|
||||||
@Input() position: Position;
|
@Input() position: GeolocationPosition;
|
||||||
@Input() location: number[]=[0,0];
|
@Input() location: number[]=[0,0];
|
||||||
@Input() locationTolerance: number = 0;
|
@Input() locationTolerance: number = 0;
|
||||||
@Input() showHeading: boolean = false;
|
@Input() showHeading: boolean = false;
|
||||||
@Input() heading: number = 0;
|
@Input() showTolerance: boolean = false;
|
||||||
@Input() headingTolerance: number = 0;
|
@Input() heading: number = 0;
|
||||||
public locTolerancePixels: number = 0;
|
@Input() headingTolerance: number = 0;
|
||||||
public path: string = "";
|
public locTolerancePixels: number = 0;
|
||||||
public rotate: string = "";
|
public path: string = "";
|
||||||
private resolution: number = 0;
|
public rotate: string = "";
|
||||||
@ViewChild('location') locationElement: ElementRef;
|
private resolution: number = 0;
|
||||||
|
initialized:boolean = false;
|
||||||
constructor(private map: MapComponent) {
|
@ViewChild('location', { static: true }) locationElement: ElementRef;
|
||||||
|
|
||||||
}
|
constructor(private map: MapComponent) {
|
||||||
|
|
||||||
recalcLocationTolerance() {
|
}
|
||||||
this.locTolerancePixels = this.resolution >0? this.locationTolerance / this.resolution:0;
|
|
||||||
}
|
recalcLocationTolerance() {
|
||||||
|
this.locTolerancePixels = this.resolution >0? this.locationTolerance / this.resolution:0;
|
||||||
ngOnInit() {
|
}
|
||||||
this.instance = new Overlay({
|
|
||||||
stopEvent:false,
|
ngOnInit() {
|
||||||
positioning: 'center-center',
|
this.instance = new Overlay({
|
||||||
position: fromLonLat( this.location),
|
stopEvent:false,
|
||||||
element: this.locationElement.nativeElement
|
positioning: 'center-center',
|
||||||
});
|
position: fromLonLat( this.location),
|
||||||
var x = Math.tan(this.headingTolerance * Math.PI / 180)*40;
|
element: this.locationElement.nativeElement
|
||||||
var y = Math.cos(this.headingTolerance * Math.PI / 180) * 40;
|
});
|
||||||
var y1 = Math.round(500 - y);
|
var x = Math.tan(this.headingTolerance * Math.PI / 180)*40;
|
||||||
var x1 = Math.round(500 - x);
|
var y = Math.cos(this.headingTolerance * Math.PI / 180) * 40;
|
||||||
var y2 = Math.round(y1);
|
var y1 = Math.round(500 - y);
|
||||||
var x2 = Math.round(500 + x);
|
var x1 = Math.round(500 - x);
|
||||||
this.path = "M " + x2 + " " + y2 + " A 45 45,0,0,0, " + x1 + " " + y1 + " L 493 500 L 507 500 Z";
|
var y2 = Math.round(y1);
|
||||||
this.rotate = "rotate(" + Math.round(this.heading) + " 500 500)";
|
var x2 = Math.round(500 + x);
|
||||||
this.locTolerancePixels = this.locationTolerance;
|
this.path = "M " + x2 + " " + y2 + " A 45 45,0,0,0, " + x1 + " " + y1 + " L 493 500 L 507 500 Z";
|
||||||
this.map.instance.addOverlay(this.instance);
|
this.rotate = "rotate(" + Math.round(this.heading) + " 500 500)";
|
||||||
this.map.instance.getView().on('change:resolution', (evt) => {
|
this.locTolerancePixels = this.locationTolerance;
|
||||||
this.resolution = evt.target.get('resolution');
|
this.map.instance.addOverlay(this.instance);
|
||||||
this.recalcLocationTolerance();
|
this.map.instance.getView().on('change:resolution', (evt:any) => {
|
||||||
});
|
this.resolution = evt.target.get('resolution');
|
||||||
}
|
this.recalcLocationTolerance();
|
||||||
|
});
|
||||||
ngOnChanges(changes: SimpleChanges) {
|
this.initialized = true;
|
||||||
if (changes.position && this.instance) {
|
}
|
||||||
var p = changes.position.currentValue as Position;
|
|
||||||
this.instance.setPosition(fromLonLat([p.coords.longitude, p.coords.latitude]));
|
ngOnChanges(changes: SimpleChanges) {
|
||||||
this.locationTolerance = p.coords.accuracy;
|
if (changes.position && this.instance) {
|
||||||
this.recalcLocationTolerance();
|
var p = changes.position.currentValue as GeolocationPosition;
|
||||||
this.heading = p.coords.heading;
|
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/selected.features';
|
|
||||||
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+528
-277
@@ -1,277 +1,528 @@
|
|||||||
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 'ngx-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} from '../../../models/item.layer';
|
import { IRenderoutputTiles,IRenderoutputImage,IGradientstop,ILayer,IHistogram,IColor} from '../../../models/color.map';
|
||||||
import { ILayerData} from '../../../models/layer.data';
|
import {Extent} from 'ol/extent';
|
||||||
import { IRenderoutputTiles,IRenderoutputImage,IGradientstop,ILayer,IHistogram} from '../../../models/color.map';
|
import Projection from 'ol/proj/Projection';
|
||||||
import {Extent} from 'ol/extent';
|
import * as proj from 'ol/proj';
|
||||||
import Projection from 'ol/proj/Projection';
|
import * as loadingstrategy from 'ol/loadingstrategy';
|
||||||
import * as proj from 'ol/proj';
|
import * as style from 'ol/style';
|
||||||
import * as loadingstrategy from 'ol/loadingstrategy';
|
import {Tile,Layer,Image} from 'ol/layer';
|
||||||
import * as style from 'ol/style';
|
import {XYZ,ImageStatic,OSM,BingMaps,TileWMS,TileArcGISRest,TileJSON,Source} from 'ol/source';
|
||||||
import {Tile,Layer,Image} from 'ol/layer';
|
import {Vector as VectorSource} from 'ol/source';
|
||||||
import {XYZ,ImageStatic,OSM,BingMaps,TileWMS,TileArcGISRest} from 'ol/source';
|
import { Vector as VectorLayer } from 'ol/layer';
|
||||||
import {Vector as VectorSource} from 'ol/source';
|
import { VectorImage as VectorImageLayer } from 'ol/layer';
|
||||||
import { Vector as VectorLayer } 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 { Geometry } from 'ol/geom';
|
||||||
import { from } from 'rxjs';
|
import BaseLayer from 'ol/layer/Base';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'fm-map-item-layers',
|
selector: 'fm-map-item-layers',
|
||||||
template: `<ng-content></ng-content>`,
|
template: `<ng-content></ng-content>`,
|
||||||
providers: [
|
providers: [
|
||||||
{ provide: LayerGroupComponent, useExisting: forwardRef(() => ItemLayersComponent) }
|
{ provide: LayerGroupComponent, useExisting: forwardRef(() => ItemLayersComponent) }
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|
||||||
export class ItemLayersComponent extends LayerGroupComponent implements OnChanges, OnInit {
|
export class ItemLayersComponent extends LayerGroupComponent implements OnChanges, OnInit,OnDestroy {
|
||||||
@Input() itemLayers: IItemLayer[];
|
@Input() itemLayers: IItemLayer[];
|
||||||
@Input() itemLayer: IItemLayer;
|
@Input() itemLayer: IItemLayer;
|
||||||
private _apiEndPoint: string;
|
@Output() onFeatureSelected: EventEmitter<any> = new EventEmitter<any>();
|
||||||
|
@Output() onFeatureHover: EventEmitter<any> = new EventEmitter<any>();
|
||||||
constructor(private itemService: ItemService, @Host() private map: MapComponent, public appConfig: AppConfig) {
|
@Output() onPrerender: EventEmitter<any> = new EventEmitter<any>();
|
||||||
super(map);
|
private _apiEndPoint: string;
|
||||||
this._apiEndPoint = appConfig.getConfig("apiEndPoint");
|
private initialized:boolean = false;
|
||||||
}
|
private mapEventHandlerInstalled = false;
|
||||||
|
private topLayerPrerenderEventhandlerInstalled = false;
|
||||||
private styleCache = {}
|
private selectedFeatures = {};
|
||||||
|
private selectionLayer:Layer<Source> = null;
|
||||||
componentToHex(c) {
|
|
||||||
var hex = c.toString(16);
|
constructor(private itemService: ItemService, private map: MapComponent, public appConfig: AppConfig) {
|
||||||
return hex.length == 1 ? "0" + hex : hex;
|
super(map);
|
||||||
}
|
this._apiEndPoint = appConfig.getConfig("apiEndPoint");
|
||||||
|
}
|
||||||
rgbaToHex(r, g, b,a) {
|
|
||||||
return "#" + this.componentToHex(r) + this.componentToHex(g) + this.componentToHex(b) + this.componentToHex(a);
|
private styleCache = {}
|
||||||
}
|
|
||||||
|
componentToHex(c) {
|
||||||
getColorFromGradient(layer: ILayer, feature): style.Style {
|
var hex = c.toString(16);
|
||||||
var value = feature.get(layer.name);
|
return hex.length == 1 ? "0" + hex : hex;
|
||||||
var gradient: IGradientstop[] = layer.renderer.colorMap.gradient;
|
}
|
||||||
var histogram: IHistogram = layer.renderer.band.histogram;
|
|
||||||
var index = (value - histogram.min) / histogram.max;
|
rgbaToHex(r, g, b,a) {
|
||||||
var min = gradient[0];
|
return "#" + this.componentToHex(r) + this.componentToHex(g) + this.componentToHex(b) + this.componentToHex(a);
|
||||||
var max = gradient[gradient.length - 1];
|
}
|
||||||
for (var n = 0; n < gradient.length; n++) {
|
|
||||||
var s = gradient[n];
|
getColorFromGradient(layer: ILayer, value: number): IColor {
|
||||||
if (s.relativestop <= index && min.relativestop < s.relativestop && n < gradient.length - 1) min = s;
|
var gradient: IGradientstop[] = layer.renderer.colorMap.gradient;
|
||||||
if (s.relativestop >= index && max.relativestop > s.relativestop && n > 0) max = s;
|
var histogram: IHistogram = layer.renderer.band.histogram;
|
||||||
}
|
var index = (value - histogram.min) / histogram.max;
|
||||||
var i = index - min.relativestop;
|
var min = gradient[0];
|
||||||
var size = max.relativestop - min.relativestop;
|
var max = gradient[gradient.length - 1];
|
||||||
var alpha = Math.round( min.color.alpha + ((max.color.alpha - min.color.alpha) * i / size));
|
for (var n = 0; n < gradient.length; n++) {
|
||||||
var red = Math.round(min.color.red + ((max.color.red - min.color.red) * i / size));
|
var s = gradient[n];
|
||||||
var green = Math.round(min.color.green + ((max.color.green - min.color.green) * i / size));
|
if (s.relativestop <= index && min.relativestop < s.relativestop && n < gradient.length - 1) min = s;
|
||||||
var blue = Math.round(min.color.blue + ((max.color.blue - min.color.blue) * i / size));
|
if (s.relativestop >= index && max.relativestop > s.relativestop && n > 0) max = s;
|
||||||
|
}
|
||||||
return new style.Style(
|
var i = index - min.relativestop;
|
||||||
{
|
var size = max.relativestop - min.relativestop;
|
||||||
image: new style.Circle({
|
var alpha = Math.round(min.color.alpha + ((max.color.alpha - min.color.alpha) * i / size));
|
||||||
fill: new style.Fill({
|
var red = Math.round(min.color.red + ((max.color.red - min.color.red) * i / size));
|
||||||
color: this.rgbaToHex(red,green,blue,alpha)
|
var green = Math.round(min.color.green + ((max.color.green - min.color.green) * i / size));
|
||||||
}),
|
var blue = Math.round(min.color.blue + ((max.color.blue - min.color.blue) * i / size));
|
||||||
radius: 3
|
|
||||||
}),
|
return { alpha: alpha, red: red, green: green, blue: blue };
|
||||||
fill: new style.Fill({
|
}
|
||||||
color: this.rgbaToHex(red, green, blue, alpha)
|
|
||||||
}),
|
getColorForValue(layer: ILayer, value: number): IColor {
|
||||||
stroke: new style.Stroke({
|
var color: IColor = { alpha:0,red:0,green:0,blue:0};
|
||||||
color: this.rgbaToHex(red, green, blue, alpha),
|
if(layer.renderer.colorMap.entries.length>0) {
|
||||||
width: 1.25
|
color=layer.renderer.colorMap.noValue;
|
||||||
}),
|
}
|
||||||
});
|
layer.renderer.colorMap.entries.forEach((entry) => {
|
||||||
}
|
if(entry.value==value) {
|
||||||
|
color =entry.color;
|
||||||
createLayer(itemLayer: IItemLayer): Layer {
|
return;
|
||||||
var layer: Layer = null;
|
}
|
||||||
if (itemLayer.item.itemType == 'vnd.farmmaps.itemtype.geotiff.processed') {
|
});
|
||||||
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()}` });
|
|
||||||
layer = new Tile({ source: source });
|
return color;
|
||||||
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") {
|
getColor(item: IItem, layer: ILayer, feature): style.Style {
|
||||||
var rt = l.rendering as IRenderoutputTiles;
|
var value = layer.indexKey ? feature.get(layer.indexKey) : feature.get(layer.name);
|
||||||
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()}` });
|
var key = item.code + "_" + value;
|
||||||
layer = new Tile({ source: source });
|
if (!this.styleCache[key]) {
|
||||||
}
|
var color: IColor;
|
||||||
if (l && l.rendering && l.rendering.renderoutputType == "Image") {
|
if(layer.renderer.colorMap.colormapType == "manual") {
|
||||||
var ri = l.rendering as IRenderoutputImage;
|
color = this.getColorForValue(layer, value);
|
||||||
let projection = new Projection({
|
} else {
|
||||||
code: 'image',
|
color = this.getColorFromGradient(layer, value);
|
||||||
units: 'pixels',
|
}
|
||||||
extent: ri.extent
|
|
||||||
});
|
this.styleCache[key] = new style.Style(
|
||||||
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 });
|
image: new style.Circle({
|
||||||
}
|
fill: new style.Fill({
|
||||||
} else if (itemLayer.item.itemType == 'vnd.farmmaps.itemtype.shape.processed') {
|
color: this.rgbaToHex(color.red, color.green, color.blue, color.alpha)
|
||||||
var data = itemLayer.item.data;
|
}),
|
||||||
var layerIndex = itemLayer.layerIndex != -1 ? itemLayer.layerIndex : itemLayer.item.data.layers[0].index;
|
radius: 3
|
||||||
var l = itemLayer.item.data.layers[layerIndex];
|
}),
|
||||||
if (l && l.rendering && l.rendering.renderoutputType == "VectorTiles") {
|
fill: new style.Fill({
|
||||||
var rt = itemLayer.item.data.layers[layerIndex].rendering as IRenderoutputTiles;
|
color: this.rgbaToHex(color.red, color.green, color.blue, color.alpha)
|
||||||
layer = new VectorTileLayer({
|
}),
|
||||||
declutter: true,
|
stroke: new style.Stroke({
|
||||||
source: new VectorTileSource({
|
color: this.rgbaToHex(color.red, color.green, color.blue, 255),
|
||||||
maxZoom: rt.maxzoom,
|
width: 1.25
|
||||||
minZoom: rt.minzoom,
|
}),
|
||||||
format: new MVT(),
|
});
|
||||||
url: `${this._apiEndPoint}/api/v1/items/${itemLayer.item.code}/vectortiles/{z}/{x}/{y}.pbf?v=${itemLayer.item.updated.getTime()}`
|
}
|
||||||
}),
|
return this.styleCache[key];
|
||||||
style: (feature) => {
|
}
|
||||||
return this.getColorFromGradient(l, feature);
|
|
||||||
}
|
createGeotiffLayer(item:IItem,itemLayer:IItemLayer):Layer<Source> {
|
||||||
})
|
var layerIndex = -1;
|
||||||
} if (l && l.rendering && l.rendering.renderoutputType == "Tiles") {
|
var layer: Layer<Source> = null;
|
||||||
var rt = l.rendering as IRenderoutputTiles;
|
layerIndex = itemLayer.layerIndex != -1 ? itemLayer.layerIndex : item.data.layers[0].index;
|
||||||
layer = new Tile({
|
let source = new XYZ({ maxZoom: 19, minZoom: 1, url: `${this._apiEndPoint}/api/v1/items/${item.code}/tiles/${layerIndex}/{z}/{x}/{y}.png?v=${Date.parse(item.updated)}` });
|
||||||
source: new XYZ({
|
layer = new Tile({ source: source });
|
||||||
maxZoom: rt.maxzoom,
|
var data = item.data;
|
||||||
minZoom: rt.minzoom,
|
var l = (data && data.layers && data.layers.length > 0) ? data.layers[0] : null;
|
||||||
url: `${this._apiEndPoint}/api/v1/items/${itemLayer.item.code}/vectortiles/image_tiles/${layerIndex}/{z}/{x}/{y}.png?v=${itemLayer.item.updated.getTime()}`
|
if (l && l.rendering && l.rendering.renderoutputType == "Tiles") {
|
||||||
})
|
var rt = l.rendering as IRenderoutputTiles;
|
||||||
});
|
let source = new XYZ({crossOrigin: 'use-credentials', maxZoom: rt.maxzoom, minZoom: rt.minzoom, url: `${this._apiEndPoint}/api/v1/items/${item.code}/tiles/${layerIndex}/{z}/{x}/{y}.png?v=${Date.parse(item.updated)}` });
|
||||||
} else {
|
layer = new Tile({ source: source });
|
||||||
let __this = this;
|
}
|
||||||
let format = new GeoJSON();
|
if (l && l.rendering && l.rendering.renderoutputType == "Image") {
|
||||||
let source = new VectorSource({
|
var ri = l.rendering as IRenderoutputImage;
|
||||||
strategy: loadingstrategy.bbox,
|
let source = new ImageStatic({ imageExtent:ri.extent,projection:'EPSG:3857', crossOrigin: 'use-credentials', url: `${this._apiEndPoint}/api/v1/items/${item.code}/mapimage/${layerIndex}?v=${Date.parse(item.updated)}` });
|
||||||
loader: function (extent: Extent, resolution: number, projection: Projection) {
|
layer = new Image({ source: source });
|
||||||
var source = this as VectorSource;
|
}
|
||||||
__this.itemService.getItemFeatures(itemLayer.item.code, extent, projection.getCode(), layerIndex).subscribe(function (data) {
|
return layer;
|
||||||
var features = format.readFeatures(data);
|
}
|
||||||
for (let f of features) {
|
|
||||||
if (f.get("code")) {
|
createShapeLayer(item:IItem,itemLayer:IItemLayer):Layer<Source> {
|
||||||
f.setId(f.get("code"));
|
var layerIndex = -1;
|
||||||
}
|
var layer: Layer<Source> = null;
|
||||||
}
|
layerIndex = itemLayer.layerIndex != -1 ? itemLayer.layerIndex : item.data.layers[0].index;
|
||||||
source.addFeatures(features);
|
var data = item.data;
|
||||||
});
|
var l:ILayer = (data && data.layers && data.layers.length > 0) ? data.layers[layerIndex] : null;
|
||||||
}
|
if (l && l.rendering && l.rendering.renderoutputType == "VectorTiles") {
|
||||||
});
|
var rt = l.rendering as IRenderoutputTiles;
|
||||||
layer = new VectorLayer({
|
layer = new VectorTileLayer({
|
||||||
source: source,
|
declutter: true,
|
||||||
style: (feature) => {
|
source: new VectorTileSource({
|
||||||
var key = feature.get("color");
|
maxZoom: rt.maxzoom,
|
||||||
if (!this.styleCache[key]) {
|
minZoom: rt.minzoom,
|
||||||
var color = feature.get("color");
|
format: new MVT(),
|
||||||
this.styleCache[key] = new style.Style(
|
url: `${this._apiEndPoint}/api/v1/items/${item.code}/vectortiles/{z}/{x}/{y}.pbf?v=${Date.parse(item.updated)}`
|
||||||
{
|
}),
|
||||||
fill: new style.Fill({
|
style: (feature) => {
|
||||||
color: color
|
return this.getColor(item,l, feature);
|
||||||
}),
|
}
|
||||||
stroke: new style.Stroke({
|
})
|
||||||
color: color,
|
} else if (l && l.rendering && l.rendering.renderoutputType == "Tiles") {
|
||||||
width: 1.25
|
var rt = l.rendering as IRenderoutputTiles;
|
||||||
}),
|
layer = new Tile({
|
||||||
image: new style.Circle({
|
source: new XYZ({
|
||||||
fill: new style.Fill({
|
maxZoom: rt.maxzoom,
|
||||||
color: color
|
minZoom: rt.minzoom,
|
||||||
}),
|
url: `${this._apiEndPoint}/api/v1/items/${item.code}/vectortiles/image_tiles/${layerIndex}/{z}/{x}/{y}.png?v=${Date.parse(item.updated)}`
|
||||||
stroke: new style.Stroke({
|
})
|
||||||
color: color,
|
});
|
||||||
width: 1.25
|
} else {
|
||||||
}),
|
let __this = this;
|
||||||
radius: 5
|
let format = new GeoJSON();
|
||||||
}),
|
let source = new VectorSource({
|
||||||
}
|
strategy: loadingstrategy.bbox,
|
||||||
)
|
loader: function (extent: Extent, resolution: number, projection: Projection) {
|
||||||
}
|
var source = this as VectorSource<Geometry>;
|
||||||
return this.styleCache[key];
|
__this.itemService.getItemFeatures(item.code, extent, projection.getCode(), layerIndex).subscribe(function (data) {
|
||||||
}
|
var features = format.readFeatures(data);
|
||||||
});
|
for (let f of features) {
|
||||||
}
|
if (f.get("code")) {
|
||||||
} else if (itemLayer.item.itemType == 'vnd.farmmaps.itemtype.layer') {
|
f.setId(f.get("code"));
|
||||||
let data = itemLayer.item.data as ILayerData;
|
}
|
||||||
switch (data.interfaceType) {
|
}
|
||||||
case 'OSM': {
|
source.addFeatures(features);
|
||||||
let source = new OSM();
|
});
|
||||||
layer = new Tile({ source: source });
|
}
|
||||||
break;
|
});
|
||||||
}
|
layer = new VectorImageLayer({
|
||||||
case 'BingMaps': {
|
declutter: true,
|
||||||
let source = new BingMaps(data.options);
|
source: source,
|
||||||
layer = new Tile({ source: source });
|
style: (feature) => {
|
||||||
break;
|
var key =feature.get("code") + "_" + feature.get("color");
|
||||||
}
|
if (!this.styleCache[key]) {
|
||||||
case 'TileWMS': {
|
var color = feature.get("color");
|
||||||
let source = new TileWMS(data.options);
|
this.styleCache[key] = new style.Style(
|
||||||
layer = new Tile({ source: source });
|
{
|
||||||
break;
|
fill: new style.Fill({
|
||||||
}
|
color: color
|
||||||
case 'TileArcGISRest': {
|
}),
|
||||||
let source = new TileArcGISRest(data.options);
|
stroke: new style.Stroke({
|
||||||
layer = new Tile({ source: source });
|
color: color,
|
||||||
break;
|
width: 1.25
|
||||||
}
|
}),
|
||||||
default: {
|
image: new style.Circle({
|
||||||
break;
|
fill: new style.Fill({
|
||||||
}
|
color: color
|
||||||
}
|
}),
|
||||||
}
|
stroke: new style.Stroke({
|
||||||
if (layer) {
|
color: color,
|
||||||
let geometry = new GeoJSON().readGeometry(itemLayer.item.geometry);
|
width: 1.25
|
||||||
let extent = geometry ? proj.transformExtent(geometry.getExtent(), 'EPSG:4326', 'EPSG:3857') : null;
|
}),
|
||||||
if (extent) layer.setExtent(extent);
|
radius: 5
|
||||||
}
|
}),
|
||||||
|
}
|
||||||
return layer;
|
)
|
||||||
}
|
}
|
||||||
|
return this.styleCache[key];
|
||||||
ngOnInit() {
|
}
|
||||||
super.ngOnInit();
|
});
|
||||||
this.updateLayers(this.itemLayers);
|
}
|
||||||
}
|
if(l.minzoom) {
|
||||||
|
layer.setMinZoom(l.minzoom);
|
||||||
updateLayers(itemLayers: IItemLayer[]) {
|
}
|
||||||
if (itemLayers) {
|
if(l.maxzoom) {
|
||||||
var olLayers = this.instance.getLayers();
|
layer.setMaxZoom(l.maxzoom);
|
||||||
itemLayers.forEach((itemLayer, index) => {
|
}
|
||||||
|
return layer;
|
||||||
var layer = itemLayer.layer;
|
}
|
||||||
let olIndex = olLayers.getArray().indexOf(layer);
|
|
||||||
if (olIndex < 0) {
|
createSelectionLayer(itemLayer:IItemLayer):Layer<Source> {
|
||||||
// New layer: we add it to the map
|
var layerIndex = -1;
|
||||||
layer = this.createLayer(itemLayer);
|
var layer: Layer<Source> = null;
|
||||||
if (layer) {
|
layerIndex = itemLayer.layerIndex != -1 ? itemLayer.layerIndex : itemLayer.item.data.layers[0].index;
|
||||||
itemLayer.layer = layer;
|
var data = itemLayer.item.data;
|
||||||
}
|
var l:ILayer = (data && data.layers && data.layers.length > 0) ? data.layers[layerIndex] : null;
|
||||||
olLayers.insertAt(index, layer);
|
if (l && l.rendering && l.rendering.renderoutputType == "VectorTiles") {
|
||||||
} else if (index !== olIndex) {
|
return new VectorTileLayer({
|
||||||
// layer has moved inside the layers list
|
renderMode: 'vector',
|
||||||
olLayers.removeAt(olIndex);
|
source: (itemLayer.layer as VectorTileLayer).getSource(),
|
||||||
olLayers.insertAt(index, layer);
|
style: (feature) => {
|
||||||
}
|
if (feature.getId() in this.selectedFeatures) {
|
||||||
layer.setOpacity(itemLayer.opacity);
|
|
||||||
layer.setVisible(itemLayer.visible);
|
return new style.Style(
|
||||||
});
|
{
|
||||||
// Remove the layers that have disapeared from childrenLayers
|
stroke: new style.Stroke({
|
||||||
if (olLayers.getLength() > itemLayers.length) {
|
color: 'red',
|
||||||
for (let i = itemLayers.length; i < olLayers.getLength(); i++) {
|
width: 2
|
||||||
olLayers.removeAt(i);
|
})
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
minZoom: itemLayer.layer.getMinZoom(),
|
||||||
ngOnChanges(changes: SimpleChanges) {
|
maxZoom: itemLayer.layer.getMaxZoom()
|
||||||
if (this.instance) {
|
});
|
||||||
if (changes['itemLayers']) {
|
}
|
||||||
var itemLayers = changes['itemLayers'].currentValue as IItemLayer[];
|
return null;
|
||||||
this.updateLayers(itemLayers);
|
}
|
||||||
}
|
|
||||||
if (changes['itemLayer']) {
|
createExternalLayer(item:IItem,itemLayer:IItemLayer):Layer<Source> {
|
||||||
var itemLayer = changes['itemLayer'].currentValue as IItemLayer;
|
let data = item.data as ILayerData;
|
||||||
if(itemLayer) {
|
var layer: Layer<Source> = null;
|
||||||
this.updateLayers([itemLayer]);
|
switch (data.interfaceType) {
|
||||||
} else {
|
case 'OSM': {
|
||||||
this.updateLayers([]);
|
let source = new OSM();
|
||||||
}
|
layer = new Tile({ source: source });
|
||||||
}
|
break;
|
||||||
}
|
}
|
||||||
}
|
case 'BingMaps': {
|
||||||
}
|
let source = new BingMaps(data.options);
|
||||||
|
layer = new Tile({ source: source });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'TileWMS': {
|
||||||
|
let source = new TileWMS(data.options);
|
||||||
|
layer = new Tile({ source: source });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'TileJSON': {
|
||||||
|
let source = new TileJSON(data.options);
|
||||||
|
layer = new Tile({ source: source });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'TileArcGISRest': {
|
||||||
|
let source = new TileArcGISRest(data.options);
|
||||||
|
layer = new Tile({ source: source });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'VectorWFSJson': {
|
||||||
|
let 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> {
|
||||||
|
var layer: Layer<Source> = null;
|
||||||
|
var 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) {
|
||||||
|
let geometry = new GeoJSON().readGeometry(itemLayer.item.geometry);
|
||||||
|
let 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()) {
|
||||||
|
var 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;
|
||||||
|
var olLayers = this.instance.getLayers();
|
||||||
|
var layer = itemLayer.layer;
|
||||||
|
let 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;
|
||||||
|
var ils:IItemLayer[] = [];
|
||||||
|
if(Array.isArray(itemLayers)) {
|
||||||
|
ils = itemLayers;
|
||||||
|
} else {
|
||||||
|
dataLayer=true;
|
||||||
|
ils=[itemLayers];
|
||||||
|
}
|
||||||
|
let newLayers: Layer<Source>[] = [];
|
||||||
|
if (ils) {
|
||||||
|
ils.forEach((itemLayer, index) => {
|
||||||
|
if(itemLayer.item.itemType == 'vnd.farmmaps.itemtype.temporal') {
|
||||||
|
let il = itemLayer as ITemporalItemLayer;
|
||||||
|
let previousLayer = this.addOrUpdateOlLayer(il.previousItemLayer,newLayers.length);
|
||||||
|
if(previousLayer) newLayers.push(previousLayer);
|
||||||
|
let selectedLayer = this.addOrUpdateOlLayer(il.selectedItemLayer,newLayers.length);
|
||||||
|
if(selectedLayer) newLayers.push(selectedLayer);
|
||||||
|
let nextLayer = this.addOrUpdateOlLayer(il.nextItemLayer,newLayers.length);
|
||||||
|
if(nextLayer) newLayers.push(nextLayer);
|
||||||
|
this.installTopLayerPrerenderEventhandler(selectedLayer);
|
||||||
|
} else {
|
||||||
|
let layer = this.addOrUpdateOlLayer(itemLayer,newLayers.length);
|
||||||
|
if(layer) newLayers.push(layer);
|
||||||
|
this.installTopLayerPrerenderEventhandler(layer);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// Remove the layers that have disapeared from childrenLayers
|
||||||
|
var 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;
|
||||||
|
let itemLayer= this.getItemlayer(this.itemLayer);
|
||||||
|
if(itemLayer && itemLayer.layer) {
|
||||||
|
this.selectedFeatures = {};
|
||||||
|
if(itemLayer.layer ) {
|
||||||
|
let minZoom = itemLayer.layer.getMinZoom();
|
||||||
|
let currentZoom = this.map.instance.getView().getZoom();
|
||||||
|
if(currentZoom>minZoom) {
|
||||||
|
itemLayer.layer.getFeatures(event.pixel).then((features) => {
|
||||||
|
if(!features.length) {
|
||||||
|
this.onFeatureHover.emit(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let fid = features[0].getId();
|
||||||
|
let 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']) {
|
||||||
|
var itemLayers = changes['itemLayers'].currentValue as IItemLayer[];
|
||||||
|
this.updateLayers(itemLayers);
|
||||||
|
}
|
||||||
|
if (changes['itemLayer']) {
|
||||||
|
var 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+191
-207
@@ -1,207 +1,191 @@
|
|||||||
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 } from '@angular/core';
|
||||||
import { LayerVectorComponent, SourceVectorComponent, MapComponent } from 'ngx-openlayers';
|
import { LayerVectorComponent, SourceVectorComponent, MapComponent } from 'ngx-openlayers';
|
||||||
import { ItemService,ItemTypeService,IItem, IItemType } from '@farmmaps/common';
|
import { ItemService,ItemTypeService,IItem, IItemType } 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';
|
||||||
@Component({
|
import {IStyles} from '../../../models/style.cache';
|
||||||
selector: 'fm-map-item-source-vector',
|
import {FeatureIconService} from '../../../services/feature-icon.service';
|
||||||
template: `<ng-content></ng-content>`,
|
|
||||||
providers: [
|
@Component({
|
||||||
{ provide: SourceVectorComponent , useExisting: forwardRef(() => ItemVectorSourceComponent) }
|
selector: 'fm-map-item-source-vector',
|
||||||
]
|
template: `<ng-content></ng-content>`,
|
||||||
})
|
providers: [
|
||||||
export class ItemVectorSourceComponent extends SourceVectorComponent implements OnInit, OnChanges {
|
{ provide: SourceVectorComponent , useExisting: forwardRef(() => ItemVectorSourceComponent) }
|
||||||
instance: Vector;
|
]
|
||||||
private _format: GeoJSON;
|
})
|
||||||
private _select: Select;
|
export class ItemVectorSourceComponent extends SourceVectorComponent implements OnInit, OnChanges {
|
||||||
private _hoverSelect: Select;
|
instance: Vector<Geometry>;
|
||||||
private _iconScale: number = 0.05;
|
private _format: GeoJSON;
|
||||||
@Input() features: Array<Feature>;
|
private _select: Select;
|
||||||
@Input() selectedFeature: Feature;
|
private _hoverSelect: Select;
|
||||||
@Input() selectedItem: IItem;
|
private _iconScale: number = 0.05;
|
||||||
@Output() onFeaturesSelected: EventEmitter<Feature> = new EventEmitter<Feature>();
|
@Input() features: Array<Feature<Geometry>>;
|
||||||
private styleCache = {
|
@Input() selectedFeature: Feature<Geometry>;
|
||||||
'file': new style.Style({
|
@Input() selectedItem: IItem;
|
||||||
image: new style.Icon({
|
@Input() styles:IStyles;
|
||||||
anchor: [0.5, 1],
|
@Output() onFeatureSelected: EventEmitter<Feature<Geometry>> = new EventEmitter<Feature<Geometry>>();
|
||||||
scale: 0.05,
|
@Output() onFeatureHover: EventEmitter<Feature<Geometry>> = new EventEmitter<Feature<Geometry>>();
|
||||||
src: this.getIconImageDataUrl("fa fa-file-o")
|
private stylesCache:IStyles = {};
|
||||||
}),
|
|
||||||
stroke: new style.Stroke({
|
constructor(@Host() private layer: LayerVectorComponent, private itemService: ItemService, private map: MapComponent, private itemTypeService: ItemTypeService,private featureIconService$:FeatureIconService) {
|
||||||
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>) {
|
||||||
}),
|
let view = this.map.instance.getView();
|
||||||
geometry: (feature) => this.geometry(feature)
|
let resolution = view.getResolution();
|
||||||
}),
|
var geometry = feature.getGeometry();
|
||||||
'selected': new style.Style({
|
let 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 {
|
||||||
}),
|
let key = feature.get('itemType')+"_selected";
|
||||||
fill: new style.Fill({
|
let evaluatedStyle: style.Style =undefined;
|
||||||
color: 'rgba(0, 0, 255, 0.1)'
|
var 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.strategy = loadingstrategy.bbox;
|
||||||
geometry = new Point(extent.getCenter(e));
|
this.format = new GeoJSON();
|
||||||
}
|
this._select = new Select({
|
||||||
return geometry;
|
style:null,
|
||||||
}
|
hitTolerance: 10,
|
||||||
|
layers: [this.layer.instance as Layer<Source>]
|
||||||
getIconImageDataUrl(iconClass:string, backgroundColor: string = "#c80a6e",color:string = "#ffffff"): string {
|
});
|
||||||
var canvas = document.createElement('canvas');
|
this._hoverSelect = new Select({
|
||||||
canvas.width = 365;
|
style: (feature:Feature<Geometry>) => {
|
||||||
canvas.height = 560;
|
return this.getSelectedStyle(feature);
|
||||||
var ctx = canvas.getContext('2d');
|
},
|
||||||
ctx.lineWidth = 6;
|
hitTolerance: 10,
|
||||||
ctx.fillStyle = backgroundColor;
|
condition: (e: MapBrowserEvent<UIEvent>) => {
|
||||||
ctx.strokeStyle = "#000000";
|
return e.type == 'pointermove';
|
||||||
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");
|
},
|
||||||
ctx.fill(path)
|
layers: [this.layer.instance as Layer<Source>]
|
||||||
|
});
|
||||||
var iconCharacter = "";
|
this.map.instance.addInteraction(this._select);
|
||||||
if (iconClass != null) {
|
this.map.instance.addInteraction(this._hoverSelect);
|
||||||
var element = document.createElement("i");
|
this._select.on('select', (e) => {
|
||||||
element.style.display = "none";
|
if (e.selected.length > 0 && e.selected[0]) {
|
||||||
element.className = iconClass;
|
this.onFeatureSelected.emit(e.selected[0]);
|
||||||
document.body.appendChild(element);
|
} else {
|
||||||
iconCharacter = getComputedStyle(element, "::before").content.replace(/"/g, '');
|
this.onFeatureSelected.emit(null);
|
||||||
let iconFont = "200px " +getComputedStyle(element, "::before").fontFamily
|
}
|
||||||
document.body.removeChild(element);
|
});
|
||||||
ctx.strokeStyle = color;
|
this._hoverSelect.on('select', (e) => {
|
||||||
ctx.fillStyle = color;
|
if (e.selected.length > 0 && e.selected[0]) {
|
||||||
ctx.lineWidth = 15;
|
this.onFeatureHover.emit(e.selected[0]);
|
||||||
ctx.font = iconFont;
|
} else {
|
||||||
var ts = ctx.measureText(iconCharacter);
|
this.onFeatureHover.emit(null);
|
||||||
ctx.fillText(iconCharacter, 182.9 - (ts.width / 2), 250);
|
}
|
||||||
ctx.strokeText(iconCharacter, 182.9 - (ts.width / 2), 250);
|
});
|
||||||
}
|
this.instance = new Vector(this);
|
||||||
|
this.host.instance.setSource(this.instance);
|
||||||
return canvas.toDataURL();
|
|
||||||
}
|
this.host.instance.setStyle((feature) => {
|
||||||
|
var itemType = feature.get('itemType');
|
||||||
ngOnInit() {
|
var key = itemType + (this.selectedItem?"_I":"");
|
||||||
this.strategy = loadingstrategy.bbox;
|
if (!this.stylesCache[key]) {
|
||||||
this.format = new GeoJSON();
|
if (this.itemTypeService.itemTypes[itemType]) {
|
||||||
this._select = new Select({
|
let itemTypeEntry = this.itemTypeService.itemTypes[itemType];
|
||||||
style: (feature) => {
|
let fillColor = color.asArray(itemTypeEntry.iconColor);
|
||||||
return this.styleCache['selected'];
|
fillColor[3] = 0;
|
||||||
},
|
this.stylesCache[key] = new style.Style({
|
||||||
hitTolerance: 10,
|
image: itemTypeEntry.icon ? new style.Icon({
|
||||||
layers: [this.layer.instance as Layer]
|
anchor: [0.5, 1],
|
||||||
});
|
scale: 0.05,
|
||||||
this._hoverSelect = new Select({
|
src: this.featureIconService$.getIconImageDataUrl(itemTypeEntry.icon)
|
||||||
style: (feature) => {
|
}):null,
|
||||||
return this.styleCache['selected'];
|
stroke: new style.Stroke({
|
||||||
},
|
color: 'red',
|
||||||
hitTolerance: 10,
|
width: 1
|
||||||
condition: (e: MapBrowserEvent) => {
|
}),
|
||||||
return e.type == 'pointermove';
|
fill: new style.Fill({
|
||||||
},
|
color: fillColor
|
||||||
layers: [this.layer.instance as Layer]
|
}),
|
||||||
});
|
geometry:(feature:Feature<Geometry>) => this.geometry(feature)
|
||||||
this.map.instance.addInteraction(this._select);
|
});
|
||||||
this.map.instance.addInteraction(this._hoverSelect);
|
} else {
|
||||||
this._select.on('select', (e) => {
|
key = 'file';
|
||||||
if (e.selected.length > 0 && e.selected[0]) {
|
}
|
||||||
this.onFeaturesSelected.emit(e.selected[0]);
|
}
|
||||||
} else {
|
let evaluatedStyle =null;
|
||||||
this.onFeaturesSelected.emit(null);
|
var styleEntry = this.stylesCache[key];
|
||||||
}
|
if(typeof styleEntry === 'function') {
|
||||||
});
|
evaluatedStyle = styleEntry(feature);
|
||||||
this.instance = new Vector(this);
|
} else {
|
||||||
this.host.instance.setSource(this.instance);
|
evaluatedStyle = styleEntry;
|
||||||
|
}
|
||||||
this.host.instance.setStyle((feature) => {
|
if(evaluatedStyle && evaluatedStyle.geometry_ == null) {
|
||||||
var key = feature.get('itemType') + (this.selectedItem?"_I":"");
|
evaluatedStyle.setGeometry((feature) => this.geometry(feature));
|
||||||
if (!this.styleCache[key]) {
|
}
|
||||||
if (this.itemTypeService.itemTypes[key]) {
|
return evaluatedStyle;
|
||||||
let itemType = this.itemTypeService.itemTypes[key];
|
});
|
||||||
let fillColor = color.asArray(itemType.iconColor);
|
}
|
||||||
fillColor[3] = this.selectedItem?0:0.5;
|
|
||||||
this.styleCache[key] = new style.Style({
|
ngOnChanges(changes: SimpleChanges) {
|
||||||
image: itemType.icon ? new style.Icon({
|
if (changes["features"] && this.instance) {
|
||||||
anchor: [0.5, 1],
|
this.instance.clear(true);
|
||||||
scale: 0.05,
|
this._select.getFeatures().clear();
|
||||||
src: this.getIconImageDataUrl(itemType.icon)
|
this.instance.addFeatures(changes["features"].currentValue);
|
||||||
}):null,
|
}
|
||||||
stroke: new style.Stroke({
|
|
||||||
color: 'red',
|
if (changes["selectedFeature"] && this.instance) {
|
||||||
width: 1
|
var features = this._hoverSelect.getFeatures();
|
||||||
}),
|
var feature = changes["selectedFeature"].currentValue
|
||||||
fill: new style.Fill({
|
//this.instance.clear(false);
|
||||||
color: fillColor
|
//this.instance.addFeatures(features.getArray());
|
||||||
}),
|
features.clear();
|
||||||
geometry: (feature) => this.geometry(feature)
|
if (feature) {
|
||||||
});
|
//this.instance.removeFeature(feature);
|
||||||
} else {
|
features.push(feature)
|
||||||
key = 'file';
|
}
|
||||||
}
|
}
|
||||||
}
|
if (changes["selectedItem"] && this.instance) {
|
||||||
var styleEntry = this.styleCache[key];
|
var item = changes["selectedItem"].currentValue
|
||||||
return styleEntry;
|
if (item) {
|
||||||
});
|
this.map.instance.removeInteraction(this._hoverSelect);
|
||||||
}
|
} else {
|
||||||
|
this.map.instance.addInteraction(this._hoverSelect);
|
||||||
ngOnChanges(changes: SimpleChanges) {
|
}
|
||||||
if (changes["features"] && this.instance) {
|
}
|
||||||
this.instance.clear(true);
|
if (changes["styles"] && this.instance) {
|
||||||
this._select.getFeatures().clear();
|
let styles = changes["styles"].currentValue;
|
||||||
this.instance.addFeatures(changes["features"].currentValue);
|
for (const key in styles) {
|
||||||
}
|
if (styles.hasOwnProperty(key)) {
|
||||||
|
this.stylesCache[key]=styles[key];
|
||||||
if (changes["selectedFeature"] && this.instance) {
|
}
|
||||||
var features = this._select.getFeatures();
|
}
|
||||||
var feature = changes["selectedFeature"].currentValue
|
}
|
||||||
//this.instance.clear(false);
|
}
|
||||||
//this.instance.addFeatures(features.getArray());
|
}
|
||||||
features.clear();
|
|
||||||
if (feature) {
|
|
||||||
//this.instance.removeFeature(feature);
|
|
||||||
features.push(feature)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (changes["selectedItem"] && this.instance) {
|
|
||||||
var item = changes["selectedItem"].currentValue
|
|
||||||
if (item) {
|
|
||||||
this.map.instance.removeInteraction(this._hoverSelect);
|
|
||||||
} else {
|
|
||||||
this.map.instance.addInteraction(this._hoverSelect);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
+31
-29
@@ -1,29 +1,31 @@
|
|||||||
<div class="layerlist" *ngIf="itemLayers.length > 0;else noLayers">
|
<div>
|
||||||
<div class="list-group">
|
<div class="layerlist" *ngIf="itemLayers.length > 0;else noLayers">
|
||||||
<div *ngFor="let itemLayer of itemLayers" class="list-group-item list-group-item-action p-2 text-truncate" [ngClass]="{'active' : selectedLayer==itemLayer}">
|
<div class="list-group">
|
||||||
<div (click)="handleSelectLayer($event,itemLayer)" [title]="itemLayer.item.name">{{itemLayer.item.name}}</div>
|
<div *ngFor="let itemLayer of itemLayers" class="list-group-item list-group-item-action p-2 text-truncate" [ngClass]="{'active' : selectedLayer==itemLayer}">
|
||||||
<div class="mt-1" *ngIf="selectedLayer==itemLayer && !baseLayers">
|
<div (click)="handleSelectLayer($event,itemLayer)" [title]="itemLayer.item.name">{{itemLayer.item.name}}</div>
|
||||||
<span class="btn-group">
|
<div class="mt-1" *ngIf="selectedLayer==itemLayer && !baseLayers">
|
||||||
<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 class="btn-group">
|
||||||
<a title="Transparency 25%" *ngIf="itemLayer.visible" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.25)">25%</a>
|
<a title="Toggle visibility"href="#" class="btn btn-light btn-sm" (click)="handleToggleVisibility($event,itemLayer)"><i class="fa" aria-hidden="true" [ngClass]="{'fa-eye':!itemLayer.visible,'fa-eye-slash':itemLayer.visible}"></i></a>
|
||||||
<a title="Transparency 50%" *ngIf="itemLayer.visible" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.5)">50%</a>
|
<a title="Transparency 25%" *ngIf="itemLayer.visible" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.25)">25%</a>
|
||||||
<a title="Transparency 75%" *ngIf="itemLayer.visible" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.75)">75%</a>
|
<a title="Transparency 50%" *ngIf="itemLayer.visible" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.5)">50%</a>
|
||||||
<a title="No transparency" *ngIf="itemLayer.visible" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,1)">100%</a>
|
<a title="Transparency 75%" *ngIf="itemLayer.visible" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.75)">75%</a>
|
||||||
</span>
|
<a title="No transparency" *ngIf="itemLayer.visible" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,1)">100%</a>
|
||||||
<a href="#" title="Zoom to extent" class="btn btn-light btn-sm" (click)="handleZoomToExtent($event,itemLayer)"><i class="fa fa-search-plus" aria-hidden="true"></i></a>
|
</span>
|
||||||
<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>
|
<a href="#" title="Zoom to extent" class="btn btn-light btn-sm" (click)="handleZoomToExtent($event,itemLayer)"><i class="far fa-search-plus" aria-hidden="true"></i></a>
|
||||||
<span 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>
|
<span *ngIf="firstLayer(itemLayer)"><a href="#" title="Toggle legend" class="btn btn-light btn-sm" (click)="itemLayer.legendVisible=toggleLegend($event,itemLayer.legendVisible)"><i class="far fa-chart-bar" aria-hidden="true"></i></a></span>
|
||||||
</div>
|
<span *ngIf="!dataLayers" class="float-end"><a href="#" title="Remove overlay" class="btn btn-light btn-sm" (click)="handleDelete($event,itemLayer)"><i class="fas fa-layer-minus" aria-hidden="true"></i></a></span>
|
||||||
<div *ngIf="itemLayer.legendVisible">
|
</div>
|
||||||
<div class="card legend">
|
<div *ngIf="itemLayer.legendVisible">
|
||||||
<fm-map-layer-legend [layer]="firstLayer(itemLayer)" (click)="handleLegendClick($event,itemLayer);"></fm-map-layer-legend>
|
<div class="card legend">
|
||||||
</div>
|
<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>
|
||||||
<ng-template #noLayers>
|
</div>
|
||||||
<div class="list-group">
|
</div>
|
||||||
<div class="list-group-item" i18n>No layers</div>
|
<ng-template #noLayers>
|
||||||
</div>
|
<div class="list-group">
|
||||||
</ng-template>
|
<div class="list-group-item" i18n>No layers</div>
|
||||||
|
</div>
|
||||||
|
</ng-template>
|
||||||
|
|||||||
@@ -1,64 +1,65 @@
|
|||||||
import { Component,Input,Output,EventEmitter } from '@angular/core';
|
import { Component,Input,Output,EventEmitter } from '@angular/core';
|
||||||
import { IItemLayer } from '../../../models/item.layer';
|
import { IItemLayer } from '../../../models/item.layer';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'fm-map-layer-list',
|
selector: 'fm-map-layer-list',
|
||||||
templateUrl: './layer-list.component.html',
|
templateUrl: './layer-list.component.html',
|
||||||
styleUrls: ['./layer-list.component.scss']
|
styleUrls: ['./layer-list.component.scss']
|
||||||
})
|
})
|
||||||
|
|
||||||
export class LayerListComponent {
|
export class LayerListComponent {
|
||||||
@Input() itemLayers: IItemLayer[];
|
@Input() itemLayers: IItemLayer[] = [];
|
||||||
@Input() baseLayers: boolean = false;
|
@Input() baseLayers: boolean = false;
|
||||||
@Output() onToggleVisibility = new EventEmitter<IItemLayer>();
|
@Input() dataLayers: boolean = false;
|
||||||
@Output() onSetOpacity = new EventEmitter<{layer: IItemLayer,opacity:number }>();
|
@Output() onToggleVisibility = new EventEmitter<IItemLayer>();
|
||||||
@Output() onDelete = new EventEmitter<IItemLayer>();
|
@Output() onSetOpacity = new EventEmitter<{layer: IItemLayer,opacity:number }>();
|
||||||
@Output() onZoomToExtent = new EventEmitter<IItemLayer>();
|
@Output() onDelete = new EventEmitter<IItemLayer>();
|
||||||
@Output() onSelectLayer = new EventEmitter<IItemLayer>();
|
@Output() onZoomToExtent = new EventEmitter<IItemLayer>();
|
||||||
@Input() selectedLayer: IItemLayer;
|
@Output() onSelectLayer = new EventEmitter<IItemLayer>();
|
||||||
|
@Input() selectedLayer: IItemLayer;
|
||||||
constructor( ) {
|
|
||||||
}
|
constructor( ) {
|
||||||
|
}
|
||||||
handleDelete(event:MouseEvent, item:IItemLayer) {
|
|
||||||
this.onDelete.emit(item);
|
handleDelete(event:MouseEvent, item:IItemLayer) {
|
||||||
event.preventDefault();
|
this.onDelete.emit(item);
|
||||||
}
|
event.preventDefault();
|
||||||
|
}
|
||||||
handleToggleVisibility(event:MouseEvent, item: IItemLayer) {
|
|
||||||
this.onToggleVisibility.emit(item);
|
handleToggleVisibility(event:MouseEvent, item: IItemLayer) {
|
||||||
item.legendVisible = item.visible && item.legendVisible;
|
this.onToggleVisibility.emit(item);
|
||||||
event.preventDefault();
|
item.legendVisible = item.visible && item.legendVisible;
|
||||||
}
|
event.preventDefault();
|
||||||
|
}
|
||||||
handleSetOpacity(event: MouseEvent, layer: IItemLayer,opacity:number) {
|
|
||||||
this.onSetOpacity.emit({ layer,opacity });
|
handleSetOpacity(event: MouseEvent, layer: IItemLayer,opacity:number) {
|
||||||
event.preventDefault();
|
this.onSetOpacity.emit({ layer,opacity });
|
||||||
}
|
event.preventDefault();
|
||||||
|
}
|
||||||
handleZoomToExtent(event: MouseEvent, item: IItemLayer) {
|
|
||||||
this.onZoomToExtent.emit(item);
|
handleZoomToExtent(event: MouseEvent, item: IItemLayer) {
|
||||||
event.preventDefault();
|
this.onZoomToExtent.emit(item);
|
||||||
}
|
event.preventDefault();
|
||||||
|
}
|
||||||
handleSelectLayer(event: MouseEvent, item: IItemLayer) {
|
|
||||||
this.onSelectLayer.emit(item);
|
handleSelectLayer(event: MouseEvent, item: IItemLayer) {
|
||||||
event.preventDefault();
|
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];
|
firstLayer(item: IItemLayer): any {
|
||||||
return null;
|
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();
|
toggleLegend(event: MouseEvent, lg: boolean) {
|
||||||
return !lg;
|
event.preventDefault();
|
||||||
}
|
return !lg;
|
||||||
|
}
|
||||||
handleLegendClick(event: MouseEvent, item: IItemLayer) {
|
|
||||||
this.onSelectLayer.emit(item);
|
handleLegendClick(event: MouseEvent, item: IItemLayer) {
|
||||||
this.onZoomToExtent.emit(item);
|
this.onSelectLayer.emit(item);
|
||||||
event.preventDefault();
|
this.onZoomToExtent.emit(item);
|
||||||
}
|
event.preventDefault();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
<div #layerValues class="layer-values">
|
||||||
|
<div class="cross" *ngIf="enabled$ | async">
|
||||||
|
<div class="pointer"></div>
|
||||||
|
<div class="values-container border border-dark rounded p-2" *ngIf="(layerValues$ | async ) as layers">
|
||||||
|
<div class="lonlat pb-2 "><span class="font-weight-bold">{{lonlat$}}</span><i class="ms-2 fal fa-copy" (click)="copyToClipboard()"></i> </div>
|
||||||
|
<ul class="value-list p-0 mb-0" *ngIf="layers.length>0 ;else no_data">
|
||||||
|
<li class="border-top pt-1 pb-1 value" *ngFor="let layerValue of layers">
|
||||||
|
<div>{{layerValue.layerName}}</div>
|
||||||
|
<div>{{layerValue.date|date}}</div>
|
||||||
|
<div><span *ngIf="layerValue.quantity"><span class="me-1">{{layerValue.quantity}}</span> </span><span class="me-1 font-weight-bold">{{layerValue.value}}</span><span>{{layerValue.unit}}</span></div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ng-template #no_data>
|
||||||
|
<div i18n class="border-top pt-1 pb-1">No data at location</div>
|
||||||
|
</ng-template>
|
||||||
|
</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,62 @@
|
|||||||
|
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 'ngx-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']
|
||||||
|
})
|
||||||
|
export class LayerValuesComponent implements OnInit,AfterViewInit {
|
||||||
|
|
||||||
|
@ViewChild('layerValues') containerRef:ElementRef;
|
||||||
|
offsetX$:number =0;
|
||||||
|
offsetY$:number =0;
|
||||||
|
lonlat$: string="";
|
||||||
|
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() {
|
||||||
|
var xy = this.map.instance.getCoordinateFromPixel([this.offsetX$,this.offsetY$])
|
||||||
|
var 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$);
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
-8
@@ -1,9 +1,8 @@
|
|||||||
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 'ngx-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';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'fm-map-aol-layer-vector-image',
|
selector: 'fm-map-aol-layer-vector-image',
|
||||||
@@ -12,10 +11,10 @@ import { RenderType } from 'ol/layer/Vector';
|
|||||||
`,
|
`,
|
||||||
})
|
})
|
||||||
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<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>
|
||||||
+37
@@ -0,0 +1,37 @@
|
|||||||
|
@import "~bootstrap/scss/bootstrap.scss";
|
||||||
|
|
||||||
|
|
||||||
|
.gps-location {
|
||||||
|
display:block;
|
||||||
|
width:2.5em;
|
||||||
|
height:2.5em;
|
||||||
|
background-color: $body-bg;
|
||||||
|
background-size: contain;
|
||||||
|
margin-top:0.5em;
|
||||||
|
border-radius: 1.75em;
|
||||||
|
padding:0
|
||||||
|
}
|
||||||
|
|
||||||
|
.center, .tolerance, .border {
|
||||||
|
stroke-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pan-to {
|
||||||
|
fill: $secondary;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.gps-location:hover .pan-to {
|
||||||
|
fill: $white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pan-to-centered {
|
||||||
|
fill: $primary;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.gps-location:hover .pan-to-centered {
|
||||||
|
fill: theme-color-level(primary, -10)
|
||||||
|
}
|
||||||
|
|
||||||
|
.pan-to.pan-to-disabled {
|
||||||
|
fill: $gray-300;
|
||||||
|
}
|
||||||
+84
@@ -0,0 +1,84 @@
|
|||||||
|
import { Component, OnInit, Input, Host, OnChanges, SimpleChanges,ChangeDetectorRef } from '@angular/core';
|
||||||
|
import { MapComponent } from 'ngx-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']
|
||||||
|
})
|
||||||
|
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) {
|
||||||
|
let center = this.view.getCenter();
|
||||||
|
let newCenter = fromLonLat([this.position.coords.longitude,this.position.coords.latitude]);
|
||||||
|
let x1 = newCenter[0].toFixed(0);
|
||||||
|
let x2 = center[0].toFixed(0);
|
||||||
|
let y1 = newCenter[1].toFixed(0);
|
||||||
|
let y2 = center[1].toFixed(0);
|
||||||
|
return x1==x2 && y1==y2;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public disabled():boolean {
|
||||||
|
return !this.position;
|
||||||
|
}
|
||||||
|
|
||||||
|
handleClick(event:Event) {
|
||||||
|
if(this.position) {
|
||||||
|
let view = this.map.instance.getView();
|
||||||
|
let newCenter = fromLonLat([this.position.coords.longitude,this.position.coords.latitude]);
|
||||||
|
let extent = [newCenter[0]-500,newCenter[1]-500,newCenter[0]+500,newCenter[1]+500];
|
||||||
|
var options = { padding: [0, 0, 0, 0],minResolution:1 };
|
||||||
|
let size = this.map.instance.getSize();
|
||||||
|
let rem = parseFloat(getComputedStyle(document.documentElement).fontSize);
|
||||||
|
let threshold = 44 * rem;
|
||||||
|
var left = 1 * rem;
|
||||||
|
var right = 1 * rem;
|
||||||
|
var bottom = Math.round(size[1] / 2);
|
||||||
|
var 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>
|
||||||
+68
@@ -0,0 +1,68 @@
|
|||||||
|
@import "~bootstrap/scss/bootstrap.scss";
|
||||||
|
|
||||||
|
.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:$black;
|
||||||
|
}
|
||||||
|
|
||||||
|
#top-l {
|
||||||
|
fill:#d40000;
|
||||||
|
}
|
||||||
|
|
||||||
|
#top-r {
|
||||||
|
fill:#ff0000;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bottom-l {
|
||||||
|
fill:#000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bottom-r {
|
||||||
|
fill:#666666;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.compass:hover #top-l {
|
||||||
|
fill:$white;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.compass:hover #top-r {
|
||||||
|
fill:$gray-300;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.compass:hover #bottom-l {
|
||||||
|
fill:$gray-300;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.compass:hover #bottom-r {
|
||||||
|
fill:$white;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.compass:hover #north {
|
||||||
|
fill:$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
-53
@@ -1,53 +1,39 @@
|
|||||||
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 'ngx-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;
|
})
|
||||||
height:2.5em;
|
export class RotationResetComponent implements OnInit {
|
||||||
background-color: white;
|
view: View;
|
||||||
background-size: contain;
|
|
||||||
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=);
|
public Rotation() {
|
||||||
opacity: 1;
|
let rotation = this.view ? this.view.getRotation() : 0;
|
||||||
}
|
return `rotate(${rotation}rad)`;
|
||||||
.compass-n {
|
}
|
||||||
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;
|
public IsNorth() {
|
||||||
transition-delay: 2s;
|
return this.view ? this.view.getRotation() == 0 : true;
|
||||||
opacity:0;
|
}
|
||||||
}
|
|
||||||
`]
|
ngOnInit(): void {
|
||||||
})
|
this.view = this.map.instance.getView();
|
||||||
export class RotationResetComponent implements OnInit {
|
this.view.on('change:rotation', () => {
|
||||||
view: View;
|
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() {
|
handleClick(event:Event) {
|
||||||
return this.view ? this.view.getRotation() == 0 : true;
|
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
-39
@@ -1,39 +1,52 @@
|
|||||||
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 'ngx-openlayers';
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'fm-map-zoom-to-extent',
|
@Component({
|
||||||
template: `<ng-content></ng-content>`
|
selector: 'fm-map-zoom-to-extent',
|
||||||
})
|
template: `<ng-content></ng-content>`
|
||||||
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: number = 0;
|
||||||
|
paddingLeft: number = 0;
|
||||||
constructor(@Host() view: ViewComponent, @Host() map: MapComponent) {
|
paddingBottom: number = 0;
|
||||||
this.view = view;
|
paddingRight: number = 0;
|
||||||
this.map = map;
|
|
||||||
}
|
@Input() extent: number[];
|
||||||
|
@Input() animate: boolean = 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;
|
let 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;
|
var options = { padding: [0, 0, 0, 0],minResolution:1 };
|
||||||
this.view.instance.fit(this.extent, options);
|
let size = this.map.instance.getSize();
|
||||||
}
|
let rem = parseFloat(getComputedStyle(document.documentElement).fontSize);
|
||||||
}
|
let threshold = 40 * rem;
|
||||||
}
|
var left = 1 * rem;
|
||||||
|
var right = 1 * rem;
|
||||||
|
var bottom = Math.round((size[1] / 2) + (4*rem));
|
||||||
|
var 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+18
-19
@@ -1,19 +1,18 @@
|
|||||||
@import "../../_theme.scss";
|
@import "~bootstrap/scss/bootstrap.scss";
|
||||||
@import "~bootstrap/scss/bootstrap.scss";
|
|
||||||
|
|
||||||
|
|
||||||
|
.row {
|
||||||
.row {
|
border-bottom: 1px solid $gray-500;
|
||||||
border-bottom: 1px solid gray('500');
|
user-select: none;
|
||||||
user-select: none;
|
}
|
||||||
}
|
|
||||||
|
.row.selected {
|
||||||
.row:hover {
|
background-color: $gray-100;
|
||||||
background-color: gray('100');
|
}
|
||||||
}
|
|
||||||
|
@media screen and (min-width: 44rem) {
|
||||||
@media screen and (min-width: 44rem) {
|
.feature-list-container {
|
||||||
.feature-list-container {
|
margin-top: 4rem;
|
||||||
margin-top: 4rem;
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
+92
-59
@@ -1,59 +1,92 @@
|
|||||||
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({
|
|
||||||
selector: 'fm-map-feature-list-container',
|
|
||||||
templateUrl: './feature-list-container.component.html',
|
@Component({
|
||||||
styleUrls: ['./feature-list-container.component.scss']
|
selector: 'fm-map-feature-list-container',
|
||||||
})
|
templateUrl: './feature-list-container.component.html',
|
||||||
export class FeatureListContainerComponent {
|
styleUrls: ['./feature-list-container.component.scss']
|
||||||
|
})
|
||||||
constructor(private store: Store<mapReducers.State>,private componentFactoryResolver: ComponentFactoryResolver, @Inject(AbstractFeatureListComponent) public featureLists: AbstractFeatureListComponent[] ) {
|
export class FeatureListContainerComponent {
|
||||||
}
|
|
||||||
|
constructor(private store: Store<mapReducers.State>,private componentFactoryResolver: ComponentFactoryResolver, @Inject(AbstractFeatureListComponent) public featureLists: AbstractFeatureListComponent[],private packageService:PackageService ) {
|
||||||
@Input() features: Array<Feature>
|
this.featureLists = [...this.featureLists].reverse();
|
||||||
@Input() queryState: IQueryState;
|
}
|
||||||
|
|
||||||
@ViewChild(WidgetHostDirective) widgetHost: WidgetHostDirective;
|
@Input() features: Array<Feature<Geometry>>
|
||||||
|
@Input() queryState: IQueryState;
|
||||||
loadComponent(queryState:IQueryState) {
|
@Input() selectedFeature: Feature<Geometry>;
|
||||||
var componentFactory: ComponentFactory<AbstractFeatureListComponent> = this.componentFactoryResolver.resolveComponentFactory(FeatureListComponent); // default
|
@Input() clickedFeature:Observable<Feature<Geometry>>;
|
||||||
var selected = -1;
|
|
||||||
for (var i = 0; i < this.featureLists.length; i++) {
|
@ViewChild(WidgetHostDirective, { static: true }) widgetHost: WidgetHostDirective;
|
||||||
if (this.featureLists[i]['forItemType'] == queryState.itemType && this.featureLists[i]['forChild'] && queryState.parentCode && queryState.parentCode != "") {
|
componentRef:any;
|
||||||
selected = i;
|
|
||||||
break;
|
loadComponent(queryState:IQueryState) {
|
||||||
} else if (this.featureLists[i]['forItemType'] == queryState.itemType) {
|
let componentFactory: ComponentFactory<AbstractFeatureListComponent> = this.componentFactoryResolver.resolveComponentFactory(FeatureListComponent); // default
|
||||||
selected = i;
|
let selected = -1;
|
||||||
break;
|
let maxMatches =0;
|
||||||
}
|
let showItem = true;
|
||||||
}
|
for (let i = 0; i < this.featureLists.length; i++) {
|
||||||
if (selected >= 0) {
|
let matches=0;
|
||||||
componentFactory = this.componentFactoryResolver.resolveComponentFactory(this.featureLists[i]['constructor'] as any);
|
let criteria=0;
|
||||||
if (this.featureLists[selected]['collapseSearch'] === true) {
|
if (this.featureLists[i]['forItemType']) {
|
||||||
this.store.dispatch(new mapActions.CollapseSearch());
|
criteria++;
|
||||||
}
|
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'] ) {
|
||||||
const componentRef = viewContainerRef.createComponent(componentFactory);
|
criteria++;
|
||||||
(<AbstractFeatureListComponent>componentRef.instance).features = this.features;
|
if(queryState.parentCode && queryState.parentCode != "") {
|
||||||
(<AbstractFeatureListComponent>componentRef.instance).queryState = this.queryState;
|
matches++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
ngOnChanges(changes: SimpleChanges) {
|
if(criteria == matches && matches > maxMatches) {
|
||||||
if (changes["features"] && changes["features"].currentValue) {
|
selected=i;
|
||||||
if (this.queryState) {
|
maxMatches = matches;
|
||||||
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 = null;
|
||||||
|
(<AbstractFeatureListComponent>this.componentRef.instance).queryState = queryState;
|
||||||
|
(<AbstractFeatureListComponent>this.componentRef.instance).selectedFeature = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+14
-14
@@ -1,14 +1,14 @@
|
|||||||
<div *ngIf="features;let features">
|
<div class="card border-0">
|
||||||
<div class="card border-0">
|
<div class="card-body" *ngIf="(schemeItem|async);let schemeItem">
|
||||||
<div class="card-body" *ngIf="(schemeItem|async);let schemeItem">
|
<fm-back-button></fm-back-button>
|
||||||
<div><a href="#" (click)="handleBackClick($event)" i18n>back</a></div>
|
<h4 i18n>Farm</h4>
|
||||||
<h4 i18n>Farm</h4>
|
<h3>{{schemeItem.name}}</h3>
|
||||||
<h3>{{schemeItem.name}}</h3>
|
<div *ngIf="features;let features">
|
||||||
<div class="cropfields">
|
<div class="cropfields">
|
||||||
<div class="row m-0" *ngFor="let feature of features" (click)="handleFeatureClick(feature)" (mouseenter)="handleFeatureMouseEnter(feature)" (mouseleave)="handleFeatureMouseLeave(feature)">
|
<div class="row m-0 ps-3 pe-3" *ngFor="let feature of features" [ngClass]="{'selected':isFeatureSelected(feature)}" (click)="handleFeatureClick(feature)" (mouseenter)="handleFeatureMouseEnter(feature)" (mouseleave)="handleFeatureMouseLeave(feature)">
|
||||||
<fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container>
|
<fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+22
-23
@@ -1,23 +1,22 @@
|
|||||||
@import "../../_theme.scss";
|
@import "~bootstrap/scss/bootstrap.scss";
|
||||||
@import "~bootstrap/scss/bootstrap.scss";
|
|
||||||
|
fm-map-feature-list-feature-container {
|
||||||
feature-list-feature-container {
|
width:100%;
|
||||||
width:100%;
|
pointer-events:none;
|
||||||
pointer-events:none;
|
}
|
||||||
}
|
|
||||||
|
.row {
|
||||||
.row {
|
border-bottom: 1px solid $gray-500;
|
||||||
border-bottom: 1px solid gray('500');
|
user-select: none;
|
||||||
user-select: none;
|
padding-left:1.5rem;
|
||||||
padding-left:1.5rem;
|
}
|
||||||
}
|
|
||||||
|
.row.selected {
|
||||||
.row:hover {
|
background-color: $gray-100;
|
||||||
background-color: gray('100');
|
}
|
||||||
}
|
|
||||||
|
.cropfields {
|
||||||
.cropfields {
|
border-top: 1px solid $gray-500;
|
||||||
border-top: 1px solid gray('500');
|
margin-left: -1.25rem;
|
||||||
margin-left: -1.5rem;
|
margin-right: -1.25rem;
|
||||||
margin-right: -1.5rem;
|
}
|
||||||
}
|
|
||||||
|
|||||||
+30
-30
@@ -1,30 +1,30 @@
|
|||||||
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']
|
||||||
})
|
})
|
||||||
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) {
|
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, private itemService: ItemService) {
|
||||||
super(store, itemTypeService,location);
|
super(store, itemTypeService,location);
|
||||||
}
|
}
|
||||||
|
|
||||||
public schemeItem: Observable<IItem>
|
public schemeItem: Observable<IItem>
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.schemeItem = this.itemService.getItem(this.queryState.parentCode);
|
this.schemeItem = this.itemService.getItem(this.queryState.parentCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-13
@@ -1,13 +1,13 @@
|
|||||||
<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>
|
<div *ngIf="features;let features">
|
||||||
<div class="farms">
|
<div class="farms">
|
||||||
<div class="row m-0" *ngFor="let feature of features" (click)="handleFeatureClick(feature)" (mouseenter)="handleFeatureMouseEnter(feature)" (mouseleave)="handleFeatureMouseLeave(feature)">
|
<div class="row m-0 ps-3 pe-3" *ngFor="let feature of features"[ngClass]="{'selected':isFeatureSelected(feature)}" (click)="handleFeatureClick(feature)" (mouseenter)="handleFeatureMouseEnter(feature)" (mouseleave)="handleFeatureMouseLeave(feature)">
|
||||||
<fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container>
|
<fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+22
-23
@@ -1,23 +1,22 @@
|
|||||||
@import "../../_theme.scss";
|
@import "~bootstrap/scss/bootstrap.scss";
|
||||||
@import "~bootstrap/scss/bootstrap.scss";
|
|
||||||
|
fm-map-feature-list-feature-container {
|
||||||
feature-list-feature-container {
|
width:100%;
|
||||||
width:100%;
|
pointer-events:none;
|
||||||
pointer-events:none;
|
}
|
||||||
}
|
|
||||||
|
.row {
|
||||||
.row {
|
border-bottom: 1px solid $gray-500;
|
||||||
border-bottom: 1px solid gray('500');
|
user-select: none;
|
||||||
user-select: none;
|
padding-left:1.5rem;
|
||||||
padding-left:1.5rem;
|
}
|
||||||
}
|
|
||||||
|
.row.selected {
|
||||||
.row:hover {
|
background-color: $gray-100;
|
||||||
background-color: gray('100');
|
}
|
||||||
}
|
|
||||||
|
.farms {
|
||||||
.farms {
|
border-top: 1px solid $gray-500;
|
||||||
border-top: 1px solid gray('500');
|
margin-left: -1.25rem;
|
||||||
margin-left: -1.5rem;
|
margin-right: -1.25rem;
|
||||||
margin-right: -1.5rem;
|
}
|
||||||
}
|
|
||||||
|
|||||||
+31
-29
@@ -1,29 +1,31 @@
|
|||||||
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()
|
|
||||||
@Component({
|
@ForItemType("vnd.farmmaps.itemtype.croppingscheme")
|
||||||
selector: 'fm-map-feature-list-croppingscheme',
|
@Injectable()
|
||||||
templateUrl: './feature-list-croppingscheme.component.html',
|
@Component({
|
||||||
styleUrls: ['./feature-list-croppingscheme.component.scss']
|
selector: 'fm-map-feature-list-croppingscheme',
|
||||||
})
|
templateUrl: './feature-list-croppingscheme.component.html',
|
||||||
export class FeatureListCroppingschemeComponent extends AbstractFeatureListComponent {
|
styleUrls: ['./feature-list-croppingscheme.component.scss']
|
||||||
|
})
|
||||||
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, private router: Router) {
|
export class FeatureListCroppingschemeComponent extends AbstractFeatureListComponent {
|
||||||
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" });
|
|
||||||
this.store.dispatch(new mapActions.DoQuery(queryState));
|
getAction(feature:Feature<Geometry>):Action {
|
||||||
}
|
var queryState = tassign(mapReducers.initialState.queryState, { parentCode: feature.get('code'), itemType: "vnd.farmmaps.itemtype.cropfield" });
|
||||||
}
|
return new mapActions.DoQuery(queryState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+61
-43
@@ -1,43 +1,61 @@
|
|||||||
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({
|
|
||||||
selector: 'fm-map-feature-list-feature-container',
|
@Component({
|
||||||
template: `
|
selector: 'fm-map-feature-list-feature-container',
|
||||||
<div>
|
template: `
|
||||||
<ng-template fm-map-widget-host></ng-template>
|
<div>
|
||||||
</div>
|
<ng-template fm-map-widget-host></ng-template>
|
||||||
`
|
</div>
|
||||||
})
|
`
|
||||||
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")) {
|
var 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+14
-6
@@ -1,6 +1,14 @@
|
|||||||
<div *ngIf="feature;let feature" class="row m-0">
|
<div *ngIf="feature;let feature" class="d-flex m-0">
|
||||||
<div class="col p-2">
|
<div class="p-2">
|
||||||
<h1 class="card-title" title="{{feature.get('name')}}">{{feature.get('name')}}</h1>
|
<div class="thumbnail">
|
||||||
<div class="card-text"><span>{{feature.get('datadate')|date}}</span> - <span>{{feature.get('dataenddate')|date}}</span> </div>
|
<fm-map-feature-thumbnail [feature]="feature"></fm-map-feature-thumbnail>
|
||||||
</div>
|
</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>
|
||||||
+26
-30
@@ -1,30 +1,26 @@
|
|||||||
@import "../../_theme.scss";
|
@import "~bootstrap/scss/bootstrap.scss";
|
||||||
@import "~bootstrap/scss/bootstrap.scss";
|
|
||||||
|
|
||||||
|
|
||||||
|
.card-title {
|
||||||
.card-title {
|
font-size: 1rem;
|
||||||
font-size: 1rem;
|
white-space: nowrap;
|
||||||
white-space: nowrap;
|
overflow: hidden;
|
||||||
overflow: hidden;
|
text-overflow: ellipsis;
|
||||||
text-overflow: ellipsis;
|
}
|
||||||
}
|
|
||||||
|
.card-text {
|
||||||
.thumbnail > img {
|
overflow: hidden;
|
||||||
width: 100%;
|
white-space: nowrap;
|
||||||
height: auto;
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
|
|
||||||
.thumbnail > div {
|
.col {
|
||||||
width: 100%;
|
overflow: hidden;
|
||||||
font-size: 2rem;
|
}
|
||||||
text-align: center;
|
|
||||||
min-height: 3rem;
|
.thumbnail {
|
||||||
color: white;
|
width: 4em;
|
||||||
padding-top: 0.5rem;
|
height: 4em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.col {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
+34
-22
@@ -1,22 +1,34 @@
|
|||||||
import { Component, Input, Injectable} from '@angular/core';
|
import { Component, Injectable,ViewChild,AfterViewInit} from '@angular/core';
|
||||||
import { Feature } from 'ol';
|
import { Feature } from 'ol';
|
||||||
import { Store } from '@ngrx/store';
|
import { Geometry } from 'ol/geom';
|
||||||
import * as mapReducers from '../../reducers/map.reducer';
|
import { Store } from '@ngrx/store';
|
||||||
import { commonReducers,ItemTypeService,AppConfig } from '@farmmaps/common';
|
import * as mapReducers from '../../reducers/map.reducer';
|
||||||
import { AbstractFeatureListFeatureComponent } from '../feature-list-feature/feature-list-feature.component';
|
import { commonReducers,ItemTypeService,AppConfig } from '@farmmaps/common';
|
||||||
import { ForItemType } from '../for-item/for-itemtype.decorator';
|
import { AbstractFeatureListFeatureComponent } from '../feature-list-feature/feature-list-feature.component';
|
||||||
|
import { ForItemType } from '../for-item/for-itemtype.decorator';
|
||||||
|
import {getArea} from 'ol/sphere';
|
||||||
@ForItemType("vnd.farmmaps.itemtype.cropfield")
|
|
||||||
@Injectable()
|
|
||||||
@Component({
|
|
||||||
selector: 'fm-map-feature-list-feature-cropfield',
|
@ForItemType("vnd.farmmaps.itemtype.cropfield")
|
||||||
templateUrl: './feature-list-feature-cropfield.component.html',
|
@Injectable()
|
||||||
styleUrls: ['./feature-list-feature-cropfield.component.scss']
|
@Component({
|
||||||
})
|
selector: 'fm-map-feature-list-feature-cropfield',
|
||||||
export class FeatureListFeatureCropfieldComponent extends AbstractFeatureListFeatureComponent {
|
templateUrl: './feature-list-feature-cropfield.component.html',
|
||||||
|
styleUrls: ['./feature-list-feature-cropfield.component.scss']
|
||||||
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService,config:AppConfig) {
|
})
|
||||||
super(store, itemTypeService,config);
|
export class FeatureListFeatureCropfieldComponent extends AbstractFeatureListFeatureComponent {
|
||||||
}
|
|
||||||
}
|
|
||||||
|
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService,config:AppConfig) {
|
||||||
|
super(store, itemTypeService,config);
|
||||||
|
}
|
||||||
|
|
||||||
|
areaInHa(feature:Feature<Geometry>):number {
|
||||||
|
if(!feature) return 0;
|
||||||
|
// get area from faeture if 0 calculate from polygon
|
||||||
|
let a = feature.get('area');
|
||||||
|
if(a) return a;
|
||||||
|
return getArea(feature.getGeometry(),{projection:"EPSG:3857"}) / 10000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+29
-30
@@ -1,30 +1,29 @@
|
|||||||
@import "../../_theme.scss";
|
@import "~bootstrap/scss/bootstrap.scss";
|
||||||
@import "~bootstrap/scss/bootstrap.scss";
|
|
||||||
|
|
||||||
|
|
||||||
|
.card-title {
|
||||||
.card-title {
|
font-size: 1rem;
|
||||||
font-size: 1rem;
|
white-space: nowrap;
|
||||||
white-space: nowrap;
|
overflow: hidden;
|
||||||
overflow: hidden;
|
text-overflow: ellipsis;
|
||||||
text-overflow: ellipsis;
|
}
|
||||||
}
|
|
||||||
|
.thumbnail > img {
|
||||||
.thumbnail > img {
|
width: 100%;
|
||||||
width: 100%;
|
height: auto;
|
||||||
height: auto;
|
}
|
||||||
}
|
|
||||||
|
.thumbnail > div {
|
||||||
.thumbnail > div {
|
width: 100%;
|
||||||
width: 100%;
|
font-size: 2rem;
|
||||||
font-size: 2rem;
|
text-align: center;
|
||||||
text-align: center;
|
min-height: 3rem;
|
||||||
min-height: 3rem;
|
color: white;
|
||||||
color: white;
|
padding-top: 0.5rem;
|
||||||
padding-top: 0.5rem;
|
}
|
||||||
}
|
|
||||||
|
.col {
|
||||||
.col {
|
overflow: hidden;
|
||||||
overflow: hidden;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
<div *ngIf="feature;let feature" class="row m-0">
|
<div *ngIf="feature;let feature" class="row m-0">
|
||||||
<div class="col-3 m-0 p-2 thumbnail">
|
<div class="col-3 w-25 m-0 p-2 thumbnail">
|
||||||
<img *ngIf="feature.get('thumbnail')" [src]="config.getConfig('apiEndPoint') + '/api/v1/items/'+feature.get('code')+'/thumbnail'" />
|
<img *ngIf="feature.get('thumbnail')" [src]="config.getConfig('apiEndPoint') + '/api/v1/items/'+feature.get('code')+'/thumbnail'" />
|
||||||
<div *ngIf="!feature.get('thumbnail')" [style.background-color]="itemTypeService.getColor(feature.get('itemType'))">
|
<div *ngIf="!feature.get('thumbnail')" [style.background-color]="itemTypeService.getColor(feature.get('itemType'))">
|
||||||
<i [ngClass]="itemTypeService.getIcon(feature.get('itemType'))"></i>
|
<i [ngClass]="itemTypeService.getIcon(feature.get('itemType'))"></i>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user