mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-09-11 17:25:02 +00:00
Compare commits
1039 Commits
convert_to
...
issue444_m
Author | SHA1 | Date | |
---|---|---|---|
bb86d04e52 | |||
4c704734cd | |||
0ffd6a857c | |||
aebb21935b | |||
f2221565c5 | |||
9ead38ee22 | |||
6402962990 | |||
9e9fa5039f | |||
e6d503a1e2 | |||
4920142540 | |||
61cf838458 | |||
e028c1ca2b | |||
7dd6cd04ba | |||
1072f539dc | |||
9bcf4cce9f | |||
9223beac47 | |||
62c78e650f | |||
e7d0c1cac6 | |||
b859283766 | |||
e595500cb8 | |||
f34847f9f6 | |||
0fa119c984 | |||
270d00c1e8 | |||
983c5f3c6a | |||
c6141e473f | |||
c30cb5879d | |||
29e384ada5 | |||
c8e5ba4738 | |||
bf0b7f1bb2 | |||
d6cc69b919 | |||
ac33c6aad8 | |||
89383a5ec4 | |||
0fd26da299 | |||
6fa99655b2 | |||
a387305ef8 | |||
e0c7daf3fd | |||
4304baeca5 | |||
d2a567c79e | |||
3c04ced1a3 | |||
a28d8a7287 | |||
1c055e842e | |||
dea283d655 | |||
58c8373c81 | |||
a1ccfadac1 | |||
632b1262f9 | |||
e157624479 | |||
3a2370d536 | |||
|
eee38e9577 | ||
981c94906d | |||
adce90c151 | |||
83f8402081 | |||
22417ee9f9 | |||
3c5d269ece | |||
42579b5752 | |||
15023d348a | |||
fbf777e134 | |||
450277f32a | |||
|
1f5d529d33 | ||
93128cb61b | |||
|
c19099e76c | ||
d3d655293e | |||
|
692343aae4 | ||
0592601aa6 | |||
a17f5948fb | |||
|
4dd9bc1123 | ||
6578f66fec | |||
3f2a19a6f0 | |||
d5160ead4c | |||
a6e9cbdece | |||
657bf7075b | |||
f1c3e8dc1b | |||
a9624b36f7 | |||
db4aec9a18 | |||
c34ce48a53 | |||
93345c09a1 | |||
b5a1985fa1 | |||
9b4c350213 | |||
199a441593 | |||
f42d106e3c | |||
13eddbfc5b | |||
7c30126fed | |||
e3c5f6f95f | |||
a86f1a05ac | |||
9ba0cb0c2a | |||
add8588767 | |||
a083a320ae | |||
64fa7f2e00 | |||
c7a830ee28 | |||
9aa51406fa | |||
344981cf99 | |||
28c4d6b92f | |||
ef2ab5faf6 | |||
54dbf711f9 | |||
60951231c4 | |||
ece30b63c3 | |||
94503505f7 | |||
48589f3368 | |||
1e04c178dc | |||
37ed703abe | |||
7ed20d2fc5 | |||
5fe2a8e737 | |||
|
861abe708b | ||
|
f43e216e13 | ||
5210e7985f | |||
ddabdff206 | |||
5a692db30f | |||
659983fef1 | |||
aca5a3c731 | |||
406cfc86cd | |||
90da067fbd | |||
e7a6742964 | |||
3ffeaf419a | |||
ce2f64acd0 | |||
08f544f6ea | |||
4e862cc585 | |||
05d2c3b2e8 | |||
513207e510 | |||
dee6ed6707 | |||
d60095987c | |||
b4f9be0d92 | |||
a2a0f6af44 | |||
7fa0353d8c | |||
9256c71715 | |||
5520f3df50 | |||
a6c0d8b219 | |||
f6e667700e | |||
f94ef0798a | |||
7bd7476200 | |||
a2752765af | |||
1e81256404 | |||
6b571e87b4 | |||
4314823a70 | |||
dc08ced6c9 | |||
9d660311f0 | |||
b3e65f0733 | |||
03007370bc | |||
f9b514c869 | |||
|
91ba08dfa1 | ||
|
06142797c3 | ||
|
4185b660cc | ||
ad46776164 | |||
2343a4a334 | |||
3f83c323be | |||
9a9ed64298 | |||
|
a0cadb46db | ||
|
f139af8b6f | ||
|
1f0ef6e187 | ||
|
4afea55465 | ||
|
3d5723facb | ||
211ecf1c3e | |||
796b4ff76b | |||
9553e18d83 | |||
02d9a713de | |||
6cc4fa582e | |||
b8d43f36eb | |||
06b3d63133 | |||
232e71f46c | |||
0b5a0e65a8 | |||
ef42227e6c | |||
2af3de4f61 | |||
8bafa37fe1 | |||
|
a83b0326d7 | ||
53e03395f2 | |||
5fef4048a4 | |||
d8929a6222 | |||
33af7f36a0 | |||
3f2454cead | |||
0ac9f2df8c | |||
333224a9d5 | |||
496e5f0259 | |||
f2a62822a4 | |||
7879a99197 | |||
72d8cc297f | |||
1a0674a20b | |||
572aa2c14e | |||
bc4b2c4e86 | |||
a227e88e79 | |||
d9e9f472fb | |||
fcff4bf863 | |||
79b82e09e1 | |||
|
a78f29cffc | ||
e98b1b049b | |||
99efa51794 | |||
76932e6e8c | |||
97d2e3d5b5 | |||
a2063ab13b | |||
2bb718f3ea | |||
c6373a075d | |||
46337ef25d | |||
2f5fecf414 | |||
5d2cb8c712 | |||
460502a1f2 | |||
cdd7a16d18 | |||
ec29758547 | |||
c5cbdd97ff | |||
05fc5a1829 | |||
c3de3c6c39 | |||
1530e9d13a | |||
a986b4ae98 | |||
0854b7fc6a | |||
730199cca4 | |||
de1dddbb85 | |||
a612d7dd9f | |||
50e722e637 | |||
e4d5e40a8b | |||
479ec25d99 | |||
930b6ff77e | |||
7d8bd089a2 | |||
|
ebdcc5a07d | ||
|
0f31a49890 | ||
2c566bb21c | |||
a0bc6c7604 | |||
a4457664d4 | |||
b42ae76bdf | |||
2eb1ebd263 | |||
b79885cd21 | |||
69dd920fd6 | |||
0689ca366d | |||
af1c268784 | |||
1162c436c1 | |||
170ce2d51c | |||
571a8a0edc | |||
bdbb83ab85 | |||
971789d5cf | |||
72815e4b70 | |||
44183957b8 | |||
434d672d8a | |||
5f6cffa08a | |||
e21ff588ae | |||
0383571a9e | |||
f358e78734 | |||
43ef31b93f | |||
222dae3c32 | |||
08c13b8c98 | |||
1bc2500b28 | |||
f648a9351b | |||
ffe466a334 | |||
|
3978e7c959 | ||
|
2eb5c45a4d | ||
15393d9da9 | |||
695d22adba | |||
|
fefe208260 | ||
bc1a63354c | |||
c14101714c | |||
faebb0fe30 | |||
8ec5636c57 | |||
68d99050bc | |||
fba7060a91 | |||
6894fa7101 | |||
41fa1d9ca6 | |||
f4bca2f410 | |||
6198891202 | |||
c806c06279 | |||
e04c02055c | |||
4fa1bb4341 | |||
ac5675933d | |||
e7db71b0f3 | |||
|
1967fc4bed | ||
|
befd5dac42 | ||
186b8847d9 | |||
90d0cbc3b1 | |||
ac3d39b151 | |||
efb5bd64b4 | |||
76a7b019eb | |||
739540af64 | |||
230d73498e | |||
|
a68a43adc0 | ||
|
5a75e38f33 | ||
1c02eb23fd | |||
1ba5df1280 | |||
73c4a5d39d | |||
0a58c43952 | |||
a3b823d33f | |||
de45555c5a | |||
0add020e57 | |||
84a76d2c76 | |||
d88207132b | |||
932d0e86d9 | |||
671f1223b5 | |||
1a04d903fc | |||
125dd4d980 | |||
2ddab027ed | |||
1724400d7c | |||
d1a0934bb1 | |||
bc90664480 | |||
99dc7490cb | |||
5ac485e06e | |||
dc184762d6 | |||
86e7b0f007 | |||
fdafe7c82b | |||
d285d84068 | |||
da22532587 | |||
b83ad77fd8 | |||
00ac6aa1b9 | |||
318c001904 | |||
e2d406b97b | |||
|
efff496f7a | ||
fe4eaa92be | |||
cb17a7e8a5 | |||
ad4153a07e | |||
e95093f144 | |||
59cdf07c7e | |||
292c9380ad | |||
701ad17299 | |||
7f41f14959 | |||
fcd5fba13e | |||
2c57eab4d2 | |||
2cd51eed2e | |||
72e306b583 | |||
917dd49d07 | |||
71ca912749 | |||
4620e32b82 | |||
0cda5d637d | |||
646f39b9ed | |||
|
105fe16122 | ||
|
4d1a553474 | ||
5bfdee0c28 | |||
ae33392ad0 | |||
0e0fe90277 | |||
792eafce72 | |||
616d01a6c9 | |||
|
21edc74ada | ||
ab23290599 | |||
1a2e1eaf2a | |||
feaee8a0b1 | |||
0a26e7f326 | |||
ebf85d4e4d | |||
72cffd7a3d | |||
65418b17ce | |||
|
8432c215a3 | ||
|
87e1f8f077 | ||
|
33f393203e | ||
6aa1e136b4 | |||
10a9b6c909 | |||
ce912e4405 | |||
ab11d3e8b3 | |||
|
445fe0cee4 | ||
7c6c8de456 | |||
0378df42b6 | |||
ad8d40cb1c | |||
f4516f8369 | |||
5b25f82963 | |||
8720cc730e | |||
44d1535bfb | |||
8d663cdee6 | |||
7c8b08c3a7 | |||
6df570d96c | |||
3ce650eea6 | |||
6ef7d9b47b | |||
af3847366b | |||
d70f8aa712 | |||
14463dcd38 | |||
b9c2d63a53 | |||
3fd4c6339a | |||
4d76de5f9f | |||
0a92ad905b | |||
7af7135971 | |||
c70a4dc664 | |||
dc0fae7549 | |||
b38924cc3d | |||
58c4e37116 | |||
3656825d20 | |||
39a7cecd24 | |||
6d382f93e8 | |||
6e554e74ab | |||
4c125865cf | |||
12c68a4c9f | |||
66ac5c7435 | |||
e4b46a188c | |||
7a78e8a6a7 | |||
4496836cb2 | |||
88d1fe24b4 | |||
0ea1708fe9 | |||
a9b7cf93e9 | |||
5d36e56641 | |||
f00dfad98e | |||
7943c22ae7 | |||
d365fcea39 | |||
9f9f9d7881 | |||
20f814766c | |||
ed00a882af | |||
5d7501d36e | |||
ab5f9923a6 | |||
1a5e8b9d7b | |||
f7f2bb0caa | |||
bf7fcfa41a | |||
9056ea8449 | |||
f0e349a2b0 | |||
2ccc6f1976 | |||
cf041cf49e | |||
72d593e416 | |||
287dca07aa | |||
910f9a7e8e | |||
9457483a6b | |||
6d07168529 | |||
420f81ea24 | |||
416b62fc60 | |||
ecae7dab44 | |||
126bd1a4eb | |||
450792e446 | |||
ec155b1d67 | |||
02b2af7d51 | |||
0a6a2c968c | |||
4b188e2df6 | |||
d6bf1988f6 | |||
94c9505c05 | |||
4a5a1440ff | |||
b31cc460fa | |||
48c3432191 | |||
7b4405f6fe | |||
ce3a74326d | |||
51ab013bd7 | |||
41a6366efe | |||
c3c2fd30f0 | |||
1952e4aa5a | |||
1e1311b7c8 | |||
fc1ed8b71e | |||
2144b247b3 | |||
e4629ed599 | |||
f27dca6fb5 | |||
8c27ec0720 | |||
8392e2e6bd | |||
963b0b1ed2 | |||
|
7513187a6d | ||
|
990fc0e484 | ||
8fce27a128 | |||
55c2c41cea | |||
0bd10b6dfa | |||
8cd01d4317 | |||
71293e3378 | |||
cb58afa44a | |||
7b3e9cb490 | |||
fb720a382f | |||
a4bfa1cb16 | |||
502f2aceed | |||
|
eb9cc0b63f | ||
|
7ee554b48d | ||
|
2e6d281bfc | ||
|
4b1bf7ce23 | ||
|
2d574fea2e | ||
0e2772336f | |||
320d11671a | |||
6ef5390a26 | |||
dec26e2ba4 | |||
514d75fa5f | |||
0ac51da31a | |||
90d43b0bd3 | |||
5fe0790912 | |||
ff66aa5590 | |||
8e2d3616b5 | |||
c046824ea3 | |||
a9b216b16b | |||
f866eae581 | |||
|
21d4e49fce | ||
17b887160a | |||
c7dbaae8d6 | |||
|
25ee11e4ff | ||
|
df661fc7c4 | ||
|
6b78c06dfb | ||
daff4e4200 | |||
53b3f98bba | |||
2b47868d88 | |||
54c2b92962 | |||
|
d087f051f0 | ||
|
b3edba3abe | ||
|
02d8ceba25 | ||
|
741043c177 | ||
c42f62de4c | |||
e23ef35b75 | |||
eccc75aecf | |||
7e2fbf93f9 | |||
6ab8f95f7d | |||
ad05b3bf05 | |||
1faa9812db | |||
a786578cbe | |||
c08bd76e4b | |||
20a4950c60 | |||
cdbae1eade | |||
45f3bb00d6 | |||
2b9f0e5177 | |||
fcf2ae364f | |||
92788ccdc0 | |||
84993ca05b | |||
972657b38e | |||
b26d0905a3 | |||
4ab0a28f7d | |||
52009bd7c6 | |||
7acd6c7fc3 | |||
f26cba415b | |||
8a2e588190 | |||
d63d9c2f4e | |||
dcdee1d6e3 | |||
dd589af1be | |||
|
ce594692b3 | ||
|
17076024f7 | ||
|
61607fee3d | ||
|
25ebeebdfb | ||
|
343b2a6f2f | ||
|
d4efe81dbb | ||
|
9d6afc4bb2 | ||
2bdf116698 | |||
96dc711b4f | |||
c736c2b5bb | |||
|
d1918e4be0 | ||
b3aca957ff | |||
03bd4d1942 | |||
|
040c5f8847 | ||
|
9b5990916f | ||
|
74e94637b9 | ||
|
216c035bac | ||
|
16c86daafb | ||
|
175fa7bf2f | ||
|
9f7f6e33e8 | ||
|
3471bdec0d | ||
409cd40460 | |||
2811e61439 | |||
2ff34688bb | |||
8133dd7385 | |||
|
256dab3739 | ||
532a751509 | |||
|
f0a7565302 | ||
64c4f1ece2 | |||
|
ad983d80d2 | ||
001e2f9622 | |||
58ac4b01ef | |||
6e4bfd45c6 | |||
ff0b0678a5 | |||
3b56cc818b | |||
21d5f974eb | |||
59b2b07a21 | |||
eaf9f72fdd | |||
169442decc | |||
cf8e25e823 | |||
96b1f31665 | |||
2ad798c0bf | |||
7e932e838f | |||
41354097f3 | |||
9a3f35703b | |||
5423de3bd9 | |||
5e3d421b56 | |||
71ca033b08 | |||
|
2c774e814e | ||
3034ba411f | |||
ce6e51df87 | |||
|
6843b4cb2a | ||
dcbce270ad | |||
3f5a6c6b15 | |||
d806551477 | |||
120ce40dbe | |||
22022e5143 | |||
46c6d0e293 | |||
20fcaa5428 | |||
bb0a04b19a | |||
8d3ba314e0 | |||
9e48a1db0a | |||
819017112d | |||
d7d7fb5693 | |||
650e0d79be | |||
0afccd12a9 | |||
7abe3e1b2d | |||
6c71cb0e80 | |||
11d4450244 | |||
5a79df0e0a | |||
c0c2131be0 | |||
e6ea2674c2 | |||
39b5ce0320 | |||
e0ee817421 | |||
8159144f26 | |||
630115fd3a | |||
87cf8d737e | |||
ecda740d81 | |||
c9e3960238 | |||
782e098e31 | |||
34ff91979b | |||
abcc8557ce | |||
15342f85d3 | |||
b679d833da | |||
f8ca349d9e | |||
a8978a52b9 | |||
b1bffd875c | |||
b23161fa1d | |||
e540baaa4f | |||
9fe744f09f | |||
6b1310148f | |||
1650f30a59 | |||
f6386a13ac | |||
e437705714 | |||
f79225fc2b | |||
7564c2fde1 | |||
2c4d06371c | |||
8e012982f5 | |||
ba893e8429 | |||
b153fc19f6 | |||
098c2fbaa0 | |||
479e4ffe64 | |||
42a14fbd6b | |||
46ca74fc70 | |||
ae931b5869 | |||
fded08aaaa | |||
d60938352b | |||
af6f3043ae | |||
8afd1ee275 | |||
5a739380cd | |||
a1ec2b637d | |||
584b77bbf4 | |||
e84182cdac | |||
01d51da7e1 | |||
|
699dcc85de | ||
e677c0fe2f | |||
|
edeaaf0218 | ||
afae3b58c2 | |||
95027e93c6 | |||
a3ea28d307 | |||
|
921dd639bf | ||
a40077e91b | |||
8de5c8900a | |||
efc3e3915b | |||
98ab3b66ba | |||
b1cd85971a | |||
0a3b50568d | |||
69b5c98d2e | |||
5c4bef26e8 | |||
bdf4b71080 | |||
c60d46c68b | |||
be4b8a94f0 | |||
a54cc70fd6 | |||
18959f60e2 | |||
7d4ca8d149 | |||
442e2a1ede | |||
c32b767d9b | |||
140f53b81f | |||
b9e5734039 | |||
f5f5d66f3d | |||
1e0c62b09d | |||
78cf817921 | |||
40a457ba69 | |||
66aac8908c | |||
c17fd968be | |||
6f561f57a6 | |||
4f1540c541 | |||
4ef024516c | |||
ebc6d21ba6 | |||
d31661ae7a | |||
f76f7a1641 | |||
|
f63afea2ce | ||
|
660e45ac59 | ||
|
e619e58a6e | ||
160d382e07 | |||
a8fe049ecd | |||
3a207b2c5d | |||
|
08de360677 | ||
|
e2ad590310 | ||
|
6ebcd87508 | ||
|
06f8014b76 | ||
|
52f817bde7 | ||
af2eca0d03 | |||
|
33913867ee | ||
bcd25fa950 | |||
|
acf7142bad | ||
|
c8c5af8d14 | ||
|
aa6b770bfe | ||
|
4d5d5265df | ||
|
d19c5c9e41 | ||
|
cf588c97c0 | ||
|
f3f5cc550c | ||
|
c7d00ca937 | ||
|
e3c0dca1d1 | ||
|
f4c8d0b09a | ||
68ea0a1086 | |||
5bb5468198 | |||
5fead5b467 | |||
|
72a15bb823 | ||
0edd5667e0 | |||
862f9aefb0 | |||
45dd21e02a | |||
5bf1b9d8bd | |||
7bc4ad9779 | |||
1576507f7e | |||
9ddfd194be | |||
8fe94bd117 | |||
9d638fe897 | |||
478c3b3247 | |||
dc581fcf57 | |||
bd909b0061 | |||
58c7560a1c | |||
9e67d9586d | |||
982dd78828 | |||
1055fd9398 | |||
5089bba4d7 | |||
433307020a | |||
5a5ff5f54a | |||
a0b112e8db | |||
cb88a37885 | |||
9647785d8b | |||
1ad6a958e2 | |||
f453dbb543 | |||
b323ddae05 | |||
d5d64cdf65 | |||
700bb02374 | |||
bd3919efcb | |||
f6f0786d38 | |||
5cebcfddb7 | |||
11824adda4 | |||
d62893827b | |||
e972beee11 | |||
|
6a0ce72836 | ||
|
f93b1935ee | ||
|
64ec3e62da | ||
|
492d5caaf0 | ||
|
2ed3a91d8e | ||
|
b55c19cd9e | ||
|
70ca203e23 | ||
|
58a13d932f | ||
|
11c6f6d84a | ||
|
3d0be940f0 | ||
|
ea839a4b52 | ||
793f7724a7 | |||
40e7bfef4d | |||
|
d692793714 | ||
|
01ef9617d6 | ||
|
530ad497bc | ||
|
e2bc868495 | ||
|
b743475761 | ||
|
b3823161af | ||
|
beeb69c70d | ||
|
8401ce2656 | ||
|
b7360955f7 | ||
|
8c3fb6dfa7 | ||
|
c84ba5371d | ||
|
4d9c643977 | ||
f117dcd703 | |||
67c1760b51 | |||
97792fd85f | |||
ae43e23ec6 | |||
6a4d7fbece | |||
1a0dcfa8d0 | |||
66f407ab8c | |||
c7e992fd1a | |||
3d16f68f54 | |||
36890a2256 | |||
395920bd51 | |||
773aee5534 | |||
a6cc6221d6 | |||
37ed6b7591 | |||
cdc335372f | |||
e0bed186b8 | |||
d588c36308 | |||
06cbe8325c | |||
400ce3ac82 | |||
14aab637eb | |||
6296c7a307 | |||
b613a2f49b | |||
91bee4aad3 | |||
45b71b207e | |||
751a418c1f | |||
8cf08f66d5 | |||
b7c0548212 | |||
408a14926f | |||
efdd96b69f | |||
10ebf0b63a | |||
d4a5735e15 | |||
9453fc2dd5 | |||
f01b87b348 | |||
689f612382 | |||
17a81d7e66 | |||
6501a0148e | |||
44d38bcef5 | |||
75dda5b999 | |||
46ecab24c2 | |||
45c608cd48 | |||
ecbe30ae53 | |||
4e8492db70 | |||
48f62a2a17 | |||
decc74c040 | |||
de790d11a8 | |||
3a9fac08c3 | |||
f4fe297765 | |||
264bd76461 | |||
45bcb27b79 | |||
cf22a49487 | |||
e71e369f15 | |||
1a604ecf65 | |||
da7bfa8a4e | |||
d3127bed6d | |||
3c1c07dc64 | |||
530267a9b0 | |||
f9dd1c5231 | |||
f2fd30b690 | |||
3d3cc9aeb4 | |||
8b2a8544b8 | |||
be5f54c142 | |||
1fbe044729 | |||
60032c96f7 | |||
976f2fd41a | |||
19741530bf | |||
6e079fa771 | |||
8c14232a91 | |||
a983b34f0d | |||
4970cf000e | |||
1422ddeb2a | |||
9afc8c64ad | |||
200f1749f1 | |||
4645ede7d1 | |||
6016038813 | |||
d40b0e88ed | |||
f26863487b | |||
5b531a0529 | |||
a25123ee38 | |||
2524229941 | |||
119a9981af | |||
decc18596b | |||
eea72c9bcd | |||
717b71ff54 | |||
64015479b1 | |||
18fa4eb586 | |||
47574f82aa | |||
12309ca1b5 | |||
20c95a179d | |||
d5290e4bdd | |||
f4396459a0 | |||
f8071d32c0 | |||
3973cdd3f6 | |||
4dc490beb7 | |||
52a137ee77 | |||
985d8f0eae | |||
|
f0a8aa6c90 | ||
13a1ab380e | |||
041655d26e | |||
6e412117d3 | |||
|
bbebaa9fae | ||
5526790d42 | |||
cc849e279d | |||
|
159dba0dc3 | ||
550b4775bf | |||
|
f2c724726a | ||
de262bbc28 | |||
133e4858dc | |||
2bafdd9e62 | |||
d01eaa8065 | |||
b3ee745479 | |||
|
4a465b8f78 | ||
|
eaf7ae6f2f | ||
|
b5178c3be3 | ||
|
13faf6fe5a | ||
|
da12aedb53 | ||
|
af87b3f6da | ||
|
872090e02a | ||
|
4b432c64b0 | ||
|
8493a64794 | ||
|
82c027fe2a | ||
fdae6c106a | |||
1fff9ef535 | |||
20c4d07668 | |||
7f2e3ee8e2 | |||
7129b3149b | |||
|
1e99ca2ca5 | ||
cc42a4ae51 | |||
6c28ff00ab | |||
d7db8400d2 | |||
16b3be322a | |||
6e1340be27 | |||
118b208f68 | |||
e21f12d96c | |||
4b213dc290 | |||
55991a6082 | |||
|
898f25c0e4 | ||
b3929321b6 | |||
c049a0b78b | |||
10aa897899 | |||
31f5d97912 | |||
c6cda437c4 | |||
|
7e045e964a | ||
133ac67794 | |||
8fb4efc16e | |||
1823a1b031 | |||
683d055088 | |||
839fb4a211 | |||
329026e36c | |||
19a53ada88 | |||
4c31100dc7 | |||
536a1a46da | |||
5ed7572f95 | |||
f1067661d4 | |||
3592434623 | |||
94ec165c4c | |||
1c3c2be176 | |||
|
3eb7ffed1a | ||
d0c5d0423f | |||
f2117ea1cd | |||
c7ee2cc600 | |||
57c4f2ee61 | |||
95caa998e3 | |||
edaad844aa | |||
2edf36b6c5 | |||
95e45a8ad2 | |||
97165c8389 | |||
1efdade382 | |||
cf219198ca | |||
9004686a13 | |||
e266fa0e5d | |||
75ba56fa09 | |||
5a2e6c0969 | |||
84f772b42b | |||
62b8b3e6b7 | |||
5fdbba9ef5 | |||
5b321dfb81 | |||
12d6829b98 | |||
7b5e96771f | |||
8a9024de13 | |||
9387d37746 | |||
24a404964b | |||
534a8bb3af | |||
21e3da0266 | |||
85a1fcca18 | |||
793f5116ab | |||
10f276e48c | |||
8a4748dc2d | |||
f5ae5443ab | |||
5d24bd4d11 | |||
9272687ec4 | |||
6100176c9f | |||
56ab304af1 | |||
70ab232149 | |||
027c01fc58 | |||
b888211ef9 | |||
0617014e91 | |||
ce171ec747 | |||
fdc5127c74 | |||
455b225f49 | |||
fa5001265f | |||
b8d48f04ae | |||
f1b1771d6b | |||
62dabbe1e7 | |||
4101392190 | |||
3f1bed0b1c | |||
79fbdcdee4 | |||
3d8d79323e | |||
32178e22fe | |||
60a8c20896 | |||
9d8011da61 | |||
789eeadb40 | |||
f206fdb08c | |||
9d5409d8d9 | |||
e297d82533 | |||
56dd825f39 | |||
4e4add3cc1 | |||
b684bdfa3b | |||
|
b683630136 | ||
e6c60e66fc | |||
b1b9acc686 | |||
f6408af543 | |||
5b4388eae6 | |||
41ecb2351e | |||
6cc0f1f98b | |||
aa68ae0b25 | |||
ebd817f61e | |||
25147704ad | |||
2788149db4 | |||
fabe32371f | |||
b120e47786 | |||
5a61f05faa | |||
7c2a283437 | |||
2d1e8b2acd | |||
afb7d4a160 | |||
96e5e4a7b2 | |||
8e6e92ae89 | |||
07f53e6758 | |||
d2c61a26ea | |||
bbc5e94033 | |||
8e8a8c1e70 | |||
f10d762e59 | |||
9924c3a3b7 | |||
cea7160d5a | |||
5669f62fdc | |||
938720be52 | |||
c4998f4ac1 | |||
|
15c7c6ccde | ||
|
3c3d63e286 | ||
|
74682549c8 | ||
51fd81c661 | |||
063ceb2c53 | |||
6c1a946608 | |||
29134f0f11 | |||
2d319fcc42 | |||
32a7734d30 | |||
|
2e4356c3c9 | ||
51bbcab878 | |||
5645cb0cdd | |||
02c93389d8 | |||
a86ba6faf5 | |||
e1d4868f51 | |||
9244bb2f8d | |||
43702ded77 | |||
|
611f0a9ca6 | ||
|
d2704ad7e6 | ||
ff751b7f30 | |||
23eff9f6d4 | |||
e053529afb | |||
|
8affeb08d9 | ||
|
047083812e | ||
be626079d0 | |||
af6efdd0ba | |||
2245f83631 | |||
|
49da5fe060 | ||
|
bcdddcde9b | ||
|
64d3edfc42 | ||
|
912f9bacdb | ||
|
55e94fbe2a | ||
|
c5acfc9bbc | ||
|
780b7db8cb | ||
|
d71d1beb42 | ||
|
3d3ce7814b | ||
|
438cb7317a | ||
475b40e896 | |||
7719d2b073 | |||
9d0e1a82e7 | |||
9f43c99acc | |||
de4e83b3fb | |||
3404d3669c | |||
0710d6572b | |||
cf442461d6 | |||
|
6e521642a4 | ||
|
0e88d7c549 | ||
|
2993dab3f7 | ||
|
d026be3041 | ||
|
59a0b692ac | ||
|
9fa2e80d81 | ||
|
4e56075fdc | ||
|
2b01179967 | ||
|
847e610362 | ||
|
a7af7e7874 | ||
|
1bf595334e | ||
|
a3333c3302 | ||
|
7fe2172f05 | ||
bbf6b1412f | |||
9f868bff4f | |||
1c18ba20fc | |||
|
90b256daaf | ||
|
226c3eedef |
64
.env
64
.env
@@ -1,64 +0,0 @@
|
|||||||
##
|
|
||||||
## Manually dump .env files in .env.local.php with
|
|
||||||
## `$ composer symfony:dump-env prod`
|
|
||||||
##
|
|
||||||
|
|
||||||
## Project environment
|
|
||||||
APP_ENV=dev
|
|
||||||
|
|
||||||
## Enable debug
|
|
||||||
APP_DEBUG=true
|
|
||||||
|
|
||||||
## Locale
|
|
||||||
LOCALE=fr
|
|
||||||
|
|
||||||
## Framework secret
|
|
||||||
APP_SECRET=ThisTokenIsNotSoSecretChangeIt
|
|
||||||
|
|
||||||
## Symfony/swiftmailer
|
|
||||||
MAILER_TRANSPORT=smtp
|
|
||||||
MAILER_HOST=smtp
|
|
||||||
MAILER_PORT=1025
|
|
||||||
MAILER_CRYPT=
|
|
||||||
MAILER_AUTH=
|
|
||||||
MAILER_USER=
|
|
||||||
MAILER_PASSWORD=
|
|
||||||
MAILER_URL=${MAILER_TRANSPORT}://${MAILER_HOST}:${MAILER_PORT}?encryption=${MAILER_CRYPT}&auth_mode=${MAILER_AUTH}&username=${MAILER_USER}&password=${MAILER_PASSWORD}
|
|
||||||
|
|
||||||
## Notifications
|
|
||||||
NOTIFICATION_HOST=localhost:8001
|
|
||||||
NOTIFICATION_FROM_EMAIL=admin@chill.social
|
|
||||||
NOTIFICATION_FROM_NAME=Chill
|
|
||||||
|
|
||||||
## Gelf
|
|
||||||
GELF_HOST=gelf
|
|
||||||
GELF_PORT=12201
|
|
||||||
|
|
||||||
## OVH OpenStack Storage User/Role
|
|
||||||
OS_USERNAME=
|
|
||||||
OS_PASSWORD=
|
|
||||||
OS_TENANT_ID=
|
|
||||||
OS_REGION_NAME=GRA
|
|
||||||
OS_AUTH_URL=https://auth.cloud.ovh.net/v2.0/
|
|
||||||
|
|
||||||
## OVH OpenStack Storage Container
|
|
||||||
ASYNC_UPLOAD_TEMP_URL_KEY=
|
|
||||||
ASYNC_UPLOAD_TEMP_URL_BASE_PATH=
|
|
||||||
ASYNC_UPLOAD_TEMP_URL_CONTAINER=
|
|
||||||
|
|
||||||
## Redis Cache
|
|
||||||
REDIS_HOST=redis
|
|
||||||
REDIS_PORT=6379
|
|
||||||
REDIS_URL=redis://${REDIS_HOST}:${REDIS_PORT}
|
|
||||||
|
|
||||||
## Twilio
|
|
||||||
TWILIO_SID=~
|
|
||||||
TWILIO_SECRET=~
|
|
||||||
|
|
||||||
## DOCKER IMAGES REGISTRY
|
|
||||||
#IMAGE_PHP=
|
|
||||||
#IMAGE_NGINX=
|
|
||||||
|
|
||||||
## DOCKER IMAGES VERSION
|
|
||||||
#VERSION=test
|
|
||||||
VERSION=prod
|
|
@@ -3,4 +3,3 @@
|
|||||||
# Run tests from root to adapt your own environment
|
# Run tests from root to adapt your own environment
|
||||||
KERNEL_CLASS='App\Kernel'
|
KERNEL_CLASS='App\Kernel'
|
||||||
APP_SECRET='$ecretf0rt3st'
|
APP_SECRET='$ecretf0rt3st'
|
||||||
DATABASE_URL=postgresql://postgres:postgres@db:5432/postgres?serverVersion=12&charset=utf8
|
|
||||||
|
@@ -20,6 +20,8 @@ variables:
|
|||||||
# Configure postgres environment variables (https://hub.docker.com/r/_/postgres/)
|
# Configure postgres environment variables (https://hub.docker.com/r/_/postgres/)
|
||||||
POSTGRES_USER: postgres
|
POSTGRES_USER: postgres
|
||||||
POSTGRES_PASSWORD: postgres
|
POSTGRES_PASSWORD: postgres
|
||||||
|
# configure database access
|
||||||
|
DATABASE_URL: postgresql://postgres:postgres@db:5432/postgres?serverVersion=12&charset=utf8
|
||||||
# fetch the chill-app using git submodules
|
# fetch the chill-app using git submodules
|
||||||
GIT_SUBMODULE_STRATEGY: recursive
|
GIT_SUBMODULE_STRATEGY: recursive
|
||||||
REDIS_HOST: redis
|
REDIS_HOST: redis
|
||||||
@@ -60,7 +62,7 @@ code_style:
|
|||||||
- bin
|
- bin
|
||||||
- tests/app/vendor/
|
- tests/app/vendor/
|
||||||
|
|
||||||
sa_tests:
|
phpstan_tests:
|
||||||
stage: Tests
|
stage: Tests
|
||||||
image: registry.gitlab.com/chill-projet/chill-app/php-base-image:7.4
|
image: registry.gitlab.com/chill-projet/chill-app/php-base-image:7.4
|
||||||
script:
|
script:
|
||||||
@@ -71,6 +73,17 @@ sa_tests:
|
|||||||
- bin
|
- bin
|
||||||
- tests/app/vendor/
|
- tests/app/vendor/
|
||||||
|
|
||||||
|
psalm_tests:
|
||||||
|
stage: Tests
|
||||||
|
image: registry.gitlab.com/chill-projet/chill-app/php-base-image:7.4
|
||||||
|
script:
|
||||||
|
- bin/grumphp run --tasks=psalm
|
||||||
|
artifacts:
|
||||||
|
expire_in: 30 min
|
||||||
|
paths:
|
||||||
|
- bin
|
||||||
|
- tests/app/vendor/
|
||||||
|
|
||||||
unit_tests:
|
unit_tests:
|
||||||
stage: Tests
|
stage: Tests
|
||||||
image: registry.gitlab.com/chill-projet/chill-app/php-base-image:7.4
|
image: registry.gitlab.com/chill-projet/chill-app/php-base-image:7.4
|
||||||
@@ -79,7 +92,7 @@ unit_tests:
|
|||||||
- php -d memory_limit=2G tests/app/bin/console cache:clear --env=dev
|
- php -d memory_limit=2G tests/app/bin/console cache:clear --env=dev
|
||||||
- php -d memory_limit=3G tests/app/bin/console doctrine:fixtures:load -n
|
- php -d memory_limit=3G tests/app/bin/console doctrine:fixtures:load -n
|
||||||
- php -d memory_limit=2G tests/app/bin/console cache:clear --env=test
|
- php -d memory_limit=2G tests/app/bin/console cache:clear --env=test
|
||||||
- php -d memory_limit=3G bin/phpunit --colors=never
|
- php -d memory_limit=4G bin/phpunit --colors=never
|
||||||
artifacts:
|
artifacts:
|
||||||
expire_in: 30 min
|
expire_in: 30 min
|
||||||
paths:
|
paths:
|
||||||
|
225
CHANGELOG.md
225
CHANGELOG.md
@@ -11,11 +11,226 @@ and this project adheres to
|
|||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
<!-- write down unreleased development here -->
|
<!-- write down unreleased development here -->
|
||||||
* [person search] fix bug when using birthdate after and birthdate before
|
|
||||||
* [person search] increase pertinence when lastname begins with search pattern
|
|
||||||
|
|
||||||
## Test releases
|
## Test releases
|
||||||
|
|
||||||
|
### test release 2022-02-14
|
||||||
|
|
||||||
|
* AddPersons: remove ul-li html tags from AddPersons (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/419)
|
||||||
|
* [doc-generator] do not set required fields for mainPerson, person1, person2 (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement#456)
|
||||||
|
* [doc-generation] add age and obele in the mainPerson, person1 and person2 list + add obele in person renderString if addAge (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/370)
|
||||||
|
* [person] accompanying course work: fix on-the-fly update of thirdParty
|
||||||
|
* fix normalisation of accompanying course requestor api (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/378)
|
||||||
|
* [person] add a returnPath when clicking on some Person or ThirdParty badge (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/427)
|
||||||
|
* [person] accompanying course work: fix on-the-fly update of thirdParty
|
||||||
|
* [on-the-fly] close modal only after validation
|
||||||
|
* [person] correct thirdparty PATCH url + add email and altnames in AddPerson and serializer (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/433)
|
||||||
|
* change order for accompanying course work list
|
||||||
|
* [parcours]: Mes parcours brouillon added to user menu (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/440)
|
||||||
|
* [Documents]: List view adapted to display more information (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/414)
|
||||||
|
* [person]: style fix in parcours listing per person. (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/432)
|
||||||
|
* [household]: display address of current household (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/415)
|
||||||
|
* ajoute un ordre dans les localisation (api)
|
||||||
|
* [pick entity]: fix translations in modal (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/419)
|
||||||
|
* [homepage_widget]: fix translation on emergency badge (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/440)
|
||||||
|
* [person]: create person and household added to button dropdown (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/454)
|
||||||
|
* display full address in address.text in normalization. Adapt AddressRenderBox
|
||||||
|
* [address]: Correction residential address 'depuis le' (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/459)
|
||||||
|
* [Documents]: List view adapted to display more information (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/414)
|
||||||
|
* [Thirdparty_contact]: address blurred if confidential in view page (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/450)
|
||||||
|
* [homepage_widget]: If no sender then display as 'notification automatique' (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/435)
|
||||||
|
|
||||||
|
### test release 2021-02-01
|
||||||
|
|
||||||
|
* renommer "dossier numéro" en "parcours numéro" dans les résultats de recherche
|
||||||
|
* renomme date de début en date d'ouverture dans le formulaire parcours
|
||||||
|
* [homepage widget] improve content tables, improve counter pluralization with style on number
|
||||||
|
* [notification lists] add comments counter information
|
||||||
|
* [workflows] fix popover header with previous transition
|
||||||
|
* [parcours]: validation + message for closing parcours adjusted.
|
||||||
|
* [household]: household composition double edit button replaced by a delete action (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/426)
|
||||||
|
[fast_actions] improve fast-actions buttons override mechanism, fix https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/413
|
||||||
|
[homepage widget] add vue homepage_widget with asynchone loading, give a global view resume of the user concerned actions, notifications, etc.
|
||||||
|
* [person]: Comment on marital status is possible even if marital status is not defined (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/421)
|
||||||
|
* [parcours]: In the list of person results the requestor is not displayed if defined as anonymous (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/424)
|
||||||
|
* [bugfix]: modal closes and newly created person/thirdparty is selected when multiple persons/thirdparties are created through the modal (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/429)
|
||||||
|
* [person_resource]: Onthefly button added to view person/thirdparty and badge differentiation for a contact-thirdparty (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/428)
|
||||||
|
* [workflow][notification] improve how notifications and workflows are 'attached' to entities: contextual list, counter, buttons and vue modal
|
||||||
|
* [AddAddress] disable multiselect search, and rely only on most pertinent Cities and Street computed backend
|
||||||
|
* [fast_actions] improve fast-actions buttons override mechanism, fix https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/413
|
||||||
|
* [homepage widget] add vue homepage_widget with asynchone loading, give a global view resume of the user concerned actions, notifications, etc.
|
||||||
|
|
||||||
|
### test release 2021-01-31
|
||||||
|
|
||||||
|
* [person] accompanying course: optimisation: do not fetch some resources for the banner (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/409)
|
||||||
|
* [person] accompanying course: close modal when edit participation (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/420)
|
||||||
|
* [person] accompanying course: treat validation error when editing on-the-fly entities (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/420)
|
||||||
|
* [activity] show activity attendee (présence) in the activity list (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/412)
|
||||||
|
* [activity] admin: change validation rule for social action visible field (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/413)
|
||||||
|
* [parcours]: component added to change the opening date of a parcours (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/411)
|
||||||
|
* [search]: listing of parcours display changed (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/410)
|
||||||
|
* [user]: page with accompanying periods to which is user is referent (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/408)
|
||||||
|
* [person] age added to renderstring + renderbox/ vue component created to display person text (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/389)
|
||||||
|
* [household member editor] allow to push to existing household
|
||||||
|
|
||||||
|
|
||||||
|
### test release 2021-01-28
|
||||||
|
|
||||||
|
* [person] improve filiations vis graph: disable physics, use chill colors for persons-households-course, increase label of relations, remove labels on household arrows and other improvements (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/286, https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/362)
|
||||||
|
* [activity] Order activity by date and by id (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/364)
|
||||||
|
* [main] increase length of 4 Address fields (change to TEXT, no size limits) (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/277)
|
||||||
|
* [main] Add confidential option for address, in edit and view (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/165)
|
||||||
|
* [person] name suggestions within create person form when person is created departing from a search input (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/377)
|
||||||
|
* [person] Add residential address entity, form and list for each person
|
||||||
|
* [aside_activity]: dynamicUserPickerType used (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/399)
|
||||||
|
* dispatching list
|
||||||
|
|
||||||
|
|
||||||
|
### test release 2021-01-26
|
||||||
|
|
||||||
|
* [parcours] comments truncated if too long + link added (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/406)
|
||||||
|
* [person]: possibility to add person resources (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/382)
|
||||||
|
* [person ressources]: module added
|
||||||
|
|
||||||
|
|
||||||
|
### test release 2022-01-24
|
||||||
|
|
||||||
|
* [person] name suggestions within create person form when person is created departing from a search input (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/377)
|
||||||
|
* [notification: formulaire création] descend la box avec la description dans le bas du formulaire
|
||||||
|
* [notification for activity]: fix link to activity
|
||||||
|
* [notification] add "URGENT" before accompanying course with emergency = true
|
||||||
|
* [notification] add a "read more" button on system notification
|
||||||
|
* [notification] add `[Chill]` in the subject of each notification, automatically
|
||||||
|
* [notification] add a counter for notification in activity list and accompanying period list, and search results
|
||||||
|
* [parcours] bugfix if deathdate is not defined (eg. for a thirdparty) parcours is still displayed. Gave error before.
|
||||||
|
* [workflow] add breadcrumb to show steps
|
||||||
|
* [popover] add popover html popup mechanism (used by workflow breadcrumb)
|
||||||
|
* [templates] improve updatedBy macro in item metadatas
|
||||||
|
* [parcours]: bug fix when comment is pinned all other comments remain in the collection (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/385)
|
||||||
|
* [workflow]
|
||||||
|
* add My workflow section with my opened subscriptions
|
||||||
|
* apply workflow on documents, accompanyingCourseWork and Evaluations
|
||||||
|
* [wopi-link] a new vue component allow to open wopi link in a fullscreen chill-themed modal
|
||||||
|
|
||||||
|
### test release 2022-01-19
|
||||||
|
* vuejs: add dead information on all on-the-fly person render boxes, in vis graph and other templates (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/271)
|
||||||
|
* [thirdparty] fix bug in 3rd party view: types was replaced by thirdPartyTypes
|
||||||
|
* [main] location form type: fix unmapped address field (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/246)
|
||||||
|
* [activity] fix wrong import of js assets for adding and viewing documents in activity (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/83 & https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/176)
|
||||||
|
* [person]: space added between deathdate and age in twig renderbox (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/380)
|
||||||
|
* [forms] dynamic picker types for user/person/thirdparty types created (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/386)
|
||||||
|
|
||||||
|
### test release 2022-01-17
|
||||||
|
|
||||||
|
* [main] Add editableByUser field to locationType entity, adapt the admin template and add this condition in the location-type endpoint (see https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/297)
|
||||||
|
* [main] Add mainLocation field to User entity and add it in user form type
|
||||||
|
* rewrite page which allow to select activity
|
||||||
|
* [main] Add mainLocation field to User entity and add it in user form type
|
||||||
|
* [course list in person context] show full username/label for ref
|
||||||
|
* [accompanying period work] remove the possibility to generate document from an accompanying period work
|
||||||
|
* vuejs: add validation on required fields for AddPerson, Address and Location components
|
||||||
|
* vuejs: treat 422 validation errors in locations and AddPerson components
|
||||||
|
* [person]: space added between deathdate and age in twig renderbox (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/380)
|
||||||
|
|
||||||
|
## Test releases
|
||||||
|
* vuejs: add validation on required fields for AddPerson, Address and Location components
|
||||||
|
* vuejs: treat 422 validation errors in locations and AddPerson components
|
||||||
|
* [person]: space added between deathdate and age in twig renderbox (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/380)
|
||||||
|
|
||||||
|
### test release 2022-01-12
|
||||||
|
|
||||||
|
* fix thirdparty normalizer on telephone field: https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/322
|
||||||
|
|
||||||
|
### test release 2022-01-11
|
||||||
|
|
||||||
|
* vuejs: translate in French all multiselect widgets
|
||||||
|
* [address] define address lines according postal standards for France and Belgium (default) and change AddressRender, chill_entity_render_box and AddressRenderBox.vue
|
||||||
|
* [household] change translations (champs-libres/departement-de-la-vendee/accent-suivi-developpement#109)
|
||||||
|
* [household] add address i18n in household component (champs-libres/departement-de-la-vendee/accent-suivi-developpement#158)
|
||||||
|
* [household] add on the fly i18n in household component
|
||||||
|
* [household] redirect to the household page when a household is created from a person (champs-libres/departement-de-la-vendee/accent-suivi-developpement#175)
|
||||||
|
* [household] household member editor: display alert if some members have already an household (champs-libres/departement-de-la-vendee/accent-suivi-developpement#172)
|
||||||
|
* [household] household member editor: do not add in new members if the member is included in the members of household (champs-libres/departement-de-la-vendee/accent-suivi-developpement#123)
|
||||||
|
* [household] household member editor: remove markNoAddress button (champs-libres/departement-de-la-vendee/accent-suivi-developpement#109)
|
||||||
|
* [person]: ordering fields in add person (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/61)
|
||||||
|
* [person]: Add email and alt names in add person (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/61)
|
||||||
|
* [accompanyingCourse] Add a delete action and delete buttons to delete a accompanying course when step = DRAFT (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/64)
|
||||||
|
* [accompanyingCourse] Add a administrative location in the accompanying course, set the user current location as default, allow to select a location in a select field and do not allow to confirm the accompanying course if location is empty.
|
||||||
|
* [accompanyingCourse] Add the administrative location in the available variables for document generation
|
||||||
|
* AddAddress: optimize loading: wait for the user finish typing;
|
||||||
|
* UserPicker: fix bug with deprecated role
|
||||||
|
* docgen: add base context + tests
|
||||||
|
* docgen: add age for person
|
||||||
|
* [household menu] fix filiation order https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/265
|
||||||
|
* [AddAddress]: optimize loading: wait for the user finish typing;
|
||||||
|
* [UserPicker]: fix bug with deprecated role
|
||||||
|
* [docgen]: add base context + tests
|
||||||
|
* [docgen]: add age for person
|
||||||
|
* [task]: fix dropdown menu style + fix bug in singleTaskController (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/338)
|
||||||
|
* Household: fix bug when moving person on the same day (see https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/281)
|
||||||
|
* Household: show date validFrom and validTo when moving
|
||||||
|
* address reference: add index for refid
|
||||||
|
* [accompanyingCourse_work] fix styles conflicts + fix bug with remove goal (remove goals one at a time)
|
||||||
|
* [accompanyingCourse] improve masonry on resume page, add origin
|
||||||
|
* [notification] new notification interface, can be associated to AccompanyingCourse/Period, Activities.
|
||||||
|
* List notifications, show, and comment in User section
|
||||||
|
* Notify button and contextual notification box on associated objects pages
|
||||||
|
* [accompanyingCourse] add a comment for each resource associated. A modal allow to save comment. Comment is displayed in on-the-fly show modal of the accompanyingCourse context (edit page + resume page).
|
||||||
|
|
||||||
|
### test release 2021-12-14
|
||||||
|
|
||||||
|
* [asideactivity] creation of aside activity category fixed (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/262)
|
||||||
|
* [vendee/person] fix typo "situation professionelle" => "situation professionnelle"
|
||||||
|
* [main] add availableForUsers condition from locationType in the location API endpoint (champs-libres/departement-de-la-vendee/accent-suivi-developpement#248)
|
||||||
|
* [main] add the current location of the user as API point + add it in the activity location list (champs-libres/departement-de-la-vendee/accent-suivi-developpement#247)
|
||||||
|
* [activity] improve show/new/edit templates, fix SEE and SEE_DETAILS acl
|
||||||
|
* [badges] create specific badge for TMS, and make person/thirdparty badges clickable with on-the-fly modal in :
|
||||||
|
* concerned groups items (activity, calendar)
|
||||||
|
* accompanyingCourseWork lists
|
||||||
|
* accompanyingCourse lists
|
||||||
|
* [acompanyingCourse] add initial comment on Resume page
|
||||||
|
* [person] create button full width (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/330)
|
||||||
|
|
||||||
|
### test release 2021-12-11
|
||||||
|
|
||||||
|
* [main] add order field to civility
|
||||||
|
* [main] change address format in case the country is France, in Address render box and address normalizer
|
||||||
|
* [person] add validator for accompanying period with a test on social issues (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/76)
|
||||||
|
* [activity] fix visibility for location
|
||||||
|
* [origin] fix origin: use correctly the translatable strings
|
||||||
|
* /!\ everyone must update the origin table. As there is only one row, execute `update chill_person_accompanying_period_origin set label = jsonb_build_object('fr', 'appel téléphonique');`
|
||||||
|
* [person] redirect bug fixed.
|
||||||
|
* [action] add an unrelated issue within action creation.
|
||||||
|
* [origin] fix origin: use correctly the translatable strings
|
||||||
|
* /!\ everyone must update the origin table. As there is only one row, execute `update chill_person_accompanying_period_origin set label = jsonb_build_object('fr', 'appel téléphonique');`
|
||||||
|
* [main] change order of civilities in civility fixtures (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/191)
|
||||||
|
* [person] set min attr in the minimum of children field (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/191)
|
||||||
|
* [person] add marital status date in person view (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/191)
|
||||||
|
* [person] show number of children + allow set number of children to null (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/191)
|
||||||
|
* [person] show acceptSMS option (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/191)
|
||||||
|
* [person] add death information in person render box in twig and vue render boxes (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/191)
|
||||||
|
* [asideactivity] creation of aside activity category fixed (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/262)
|
||||||
|
* [vendee/person] fix typo "situation professionelle" => "situation professionnelle"
|
||||||
|
* [accompanyingcourse_work] Changes in layout/behavior of edit form (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/321)
|
||||||
|
* [badge-entity] design coherency between pills badge-person and 3 kinds of badge-thirdparty
|
||||||
|
* [AddPersons] suggestions row are clickable, not only checkbox
|
||||||
|
|
||||||
|
### test release 2021-12-06
|
||||||
|
|
||||||
|
* [main] address: use search API end points for getting postal code and reference address (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/316)
|
||||||
|
* [main] address: in edit mode, select the encoded values in multiselect for address reference and city (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/316)
|
||||||
|
* [person search] fix bug when using birthdate after and birthdate before
|
||||||
|
* [person search] increase pertinence when lastname begins with search pattern
|
||||||
|
* [activity/actions] Améliore la cohérence du design entre
|
||||||
|
* la page résumé d'un parcours (liste d'actions récentes et liste d'activités récentes)
|
||||||
|
* la page liste des actions
|
||||||
|
* la page liste des activités (contexte personne / contexte parcours)
|
||||||
|
* [household] field to edit wheter person is titulaire of household or not removed (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/322)
|
||||||
|
* [activity] create work if a work with same social action is not associated to the activity
|
||||||
|
* [visgraph] improve and fix bugs on vis-network relationship graph
|
||||||
|
* [bugfix] posting of birth- and deathdate through api fixed.
|
||||||
|
* [suggestions] improve suggestions lists
|
||||||
|
|
||||||
### Test release 2021-11-19 - bis
|
### Test release 2021-11-19 - bis
|
||||||
|
|
||||||
* [household] do not allow to create two addresses on the same date
|
* [household] do not allow to create two addresses on the same date
|
||||||
@@ -23,6 +238,7 @@ and this project adheres to
|
|||||||
* [activity] layout for issues / actions
|
* [activity] layout for issues / actions
|
||||||
* [activity][bugfix] in edit mode, the form will now load the social action list
|
* [activity][bugfix] in edit mode, the form will now load the social action list
|
||||||
|
|
||||||
|
|
||||||
### Test release 2021-11-29
|
### Test release 2021-11-29
|
||||||
|
|
||||||
* [person] suggest entities (person | thirdparty) when creating/editing the accompanying course (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/119)
|
* [person] suggest entities (person | thirdparty) when creating/editing the accompanying course (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/119)
|
||||||
@@ -50,6 +266,9 @@ and this project adheres to
|
|||||||
* [activity] for a new activity: suggest and create on-the-fly locations based on the accompanying course location + location of the suggested parties
|
* [activity] for a new activity: suggest and create on-the-fly locations based on the accompanying course location + location of the suggested parties
|
||||||
* [calendar] for a new rdv: suggest and create on-the-fly locations based on the accompanying course location + location of the suggested parties
|
* [calendar] for a new rdv: suggest and create on-the-fly locations based on the accompanying course location + location of the suggested parties
|
||||||
|
|
||||||
|
|
||||||
|
## Test releases
|
||||||
|
|
||||||
### Test release 2021-11-22
|
### Test release 2021-11-22
|
||||||
|
|
||||||
* [activity] delete admin_user_show in twig template because this route is not defined and should be defined
|
* [activity] delete admin_user_show in twig template because this route is not defined and should be defined
|
||||||
@@ -164,7 +383,7 @@ and this project adheres to
|
|||||||
* fast creation buttons
|
* fast creation buttons
|
||||||
* add ordering for types
|
* add ordering for types
|
||||||
|
|
||||||
* [AccompanyingCourse Resume page] badge-title for AccompanyingCourseWork and for Activities;
|
* [AccompanyingCourse Resume page] dashboard for AccompanyingCourseWork and for Activities;
|
||||||
* Improve badges behaviour with small screens;
|
* Improve badges behaviour with small screens;
|
||||||
|
|
||||||
* [ThirdParty]:
|
* [ThirdParty]:
|
||||||
|
@@ -397,7 +397,6 @@ Créer une liste de suggestions à enlever (avec une croix rouge cliquable, l'an
|
|||||||
<li>
|
<li>
|
||||||
<span>
|
<span>
|
||||||
item
|
item
|
||||||
<a></a>
|
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -405,7 +404,8 @@ Créer une liste de suggestions à enlever (avec une croix rouge cliquable, l'an
|
|||||||
Créer un titre enlevable (avec une croix rouge cliquable, l'ancre a est vide)
|
Créer un titre enlevable (avec une croix rouge cliquable, l'ancre a est vide)
|
||||||
```html
|
```html
|
||||||
<div class="item-title">
|
<div class="item-title">
|
||||||
title
|
<span>title</span>
|
||||||
<a></a>
|
|
||||||
</div>
|
</div>
|
||||||
```
|
```
|
||||||
|
Les classes `cols` ou `inline` peuvent être ajoutées à côté de `list-suggest` pour modifier la disposition de la liste.
|
||||||
|
Dans le dernier exemple, on met une classe `removable` sur le span, si on veut pouvoir enlever l'élément.
|
||||||
|
@@ -1,79 +1,84 @@
|
|||||||
{
|
{
|
||||||
"name": "chill-project/chill-bundles",
|
"name": "chill-project/chill-bundles",
|
||||||
"type": "library",
|
|
||||||
"description": "Most used bundles for chill-project",
|
"description": "Most used bundles for chill-project",
|
||||||
|
"license": "AGPL-3.0-only",
|
||||||
|
"type": "library",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"chill",
|
"chill",
|
||||||
"social worker"
|
"social worker"
|
||||||
],
|
],
|
||||||
"license": "AGPL-3.0-only",
|
|
||||||
"require": {
|
"require": {
|
||||||
"champs-libres/async-uploader-bundle": "dev-sf4",
|
"php": "^7.4",
|
||||||
"champs-libres/wopi-bundle": "dev-master",
|
"champs-libres/async-uploader-bundle": "dev-sf4#d57134aee8e504a83c902ff0cf9f8d36ac418290",
|
||||||
"composer/package-versions-deprecated": "^1.10",
|
"champs-libres/wopi-bundle": "dev-master#59b468503b9413f8d588ef9e626e7675560db3d8",
|
||||||
|
"champs-libres/wopi-lib": "dev-master#0e1da19bb6de820080b8651867a7e475be590060",
|
||||||
"doctrine/doctrine-bundle": "^2.1",
|
"doctrine/doctrine-bundle": "^2.1",
|
||||||
"doctrine/doctrine-migrations-bundle": "^3.0",
|
"doctrine/doctrine-migrations-bundle": "^3.0",
|
||||||
"doctrine/orm": "^2.7",
|
"doctrine/orm": "^2.7",
|
||||||
"erusev/parsedown": "^1.7",
|
"erusev/parsedown": "^1.7",
|
||||||
"graylog2/gelf-php": "^1.5",
|
"graylog2/gelf-php": "^1.5",
|
||||||
"knplabs/knp-menu": "^3.1",
|
|
||||||
"knplabs/knp-menu-bundle": "^3.0",
|
"knplabs/knp-menu-bundle": "^3.0",
|
||||||
"knplabs/knp-time-bundle": "^1.12",
|
"knplabs/knp-time-bundle": "^1.12",
|
||||||
"league/csv": "^9.7.1",
|
"league/csv": "^9.7.1",
|
||||||
"nyholm/psr7": "^1.4",
|
"nyholm/psr7": "^1.4",
|
||||||
|
"ocramius/package-versions": "^1.10",
|
||||||
"phpoffice/phpspreadsheet": "^1.16",
|
"phpoffice/phpspreadsheet": "^1.16",
|
||||||
"ramsey/uuid-doctrine": "^1.7",
|
"ramsey/uuid-doctrine": "^1.7",
|
||||||
"sensio/framework-extra-bundle": "^5.5",
|
"sensio/framework-extra-bundle": "^5.5",
|
||||||
"symfony/asset": "4.*",
|
"spomky-labs/base64url": "^2.0",
|
||||||
"symfony/browser-kit": "^5.2",
|
"symfony/asset": "^4.4",
|
||||||
"symfony/css-selector": "^5.2",
|
"symfony/browser-kit": "^4.4",
|
||||||
"symfony/expression-language": "4.*",
|
"symfony/css-selector": "^4.4",
|
||||||
"symfony/form": "4.*",
|
"symfony/expression-language": "^4.4",
|
||||||
"symfony/intl": "4.*",
|
"symfony/form": "^4.4",
|
||||||
"symfony/mime": "^4 || ^5",
|
"symfony/framework-bundle": "^4.4",
|
||||||
|
"symfony/intl": "^4.4",
|
||||||
|
"symfony/mailer": "^5.4",
|
||||||
|
"symfony/mime": "^5.4",
|
||||||
"symfony/monolog-bundle": "^3.5",
|
"symfony/monolog-bundle": "^3.5",
|
||||||
"symfony/security-bundle": "4.*",
|
"symfony/security-bundle": "^4.4",
|
||||||
"symfony/serializer": "^5.2",
|
"symfony/serializer": "^5.3",
|
||||||
"symfony/swiftmailer-bundle": "^3.5",
|
"symfony/swiftmailer-bundle": "^3.5",
|
||||||
"symfony/templating": "4.*",
|
"symfony/templating": "^4.4",
|
||||||
"symfony/translation": "4.*",
|
"symfony/translation": "^4.4",
|
||||||
"symfony/twig-bundle": "^4.4",
|
"symfony/twig-bundle": "^4.4",
|
||||||
"symfony/validator": "4.*",
|
"symfony/validator": "^4.4",
|
||||||
"symfony/webpack-encore-bundle": "^1.11",
|
"symfony/webpack-encore-bundle": "^1.11",
|
||||||
"symfony/workflow": "4.*",
|
"symfony/workflow": "^4.4",
|
||||||
"symfony/yaml": "4.*",
|
"symfony/yaml": "^4.4",
|
||||||
"twig/extra-bundle": "^2.12 || ^3.0",
|
"twig/extra-bundle": "^3.0",
|
||||||
"twig/intl-extra": "^3.0",
|
"twig/intl-extra": "^3.0",
|
||||||
"twig/markdown-extra": "^3.3",
|
"twig/markdown-extra": "^3.3",
|
||||||
"twig/twig": "^2.12 || ^3.0"
|
"twig/string-extra": "^3.3",
|
||||||
},
|
"twig/twig": "^3.0"
|
||||||
"conflict": {
|
|
||||||
"symfony/symfony": "*"
|
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"doctrine/doctrine-fixtures-bundle": "^3.3",
|
"doctrine/doctrine-fixtures-bundle": "^3.3",
|
||||||
"drupol/php-conventions": "^5",
|
"drupol/php-conventions": "^5",
|
||||||
"fakerphp/faker": "^1.13",
|
"fakerphp/faker": "^1.13",
|
||||||
"nelmio/alice": "^3.8",
|
"nelmio/alice": "^3.8",
|
||||||
|
"phpspec/prophecy-phpunit": "^2.0",
|
||||||
"phpstan/phpstan-strict-rules": "^1.0",
|
"phpstan/phpstan-strict-rules": "^1.0",
|
||||||
"phpunit/phpunit": "^7.0",
|
"phpunit/phpunit": ">= 7.5",
|
||||||
"symfony/debug-bundle": "^5.1",
|
"symfony/debug-bundle": "^5.1",
|
||||||
"symfony/dotenv": "^5.1",
|
"symfony/dotenv": "^4.4",
|
||||||
"symfony/maker-bundle": "^1.20",
|
"symfony/maker-bundle": "^1.20",
|
||||||
"symfony/phpunit-bridge": "^5.2",
|
"symfony/phpunit-bridge": "^4.4",
|
||||||
"symfony/stopwatch": "^5.1",
|
"symfony/stopwatch": "^4.4",
|
||||||
"symfony/var-dumper": "4.*",
|
"symfony/var-dumper": "^4.4",
|
||||||
"symfony/web-profiler-bundle": "^5.0"
|
"symfony/web-profiler-bundle": "^4.4"
|
||||||
},
|
},
|
||||||
"config": {
|
"conflict": {
|
||||||
"bin-dir": "bin",
|
"symfony/symfony": "*"
|
||||||
"vendor-dir": "tests/app/vendor"
|
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"Chill\\ActivityBundle\\": "src/Bundle/ChillActivityBundle",
|
"Chill\\ActivityBundle\\": "src/Bundle/ChillActivityBundle",
|
||||||
|
"Chill\\AsideActivityBundle\\": "src/Bundle/ChillAsideActivityBundle/src",
|
||||||
"Chill\\BudgetBundle\\": "src/Bundle/ChillBudgetBundle",
|
"Chill\\BudgetBundle\\": "src/Bundle/ChillBudgetBundle",
|
||||||
|
"Chill\\CalendarBundle\\": "src/Bundle/ChillCalendarBundle",
|
||||||
"Chill\\CustomFieldsBundle\\": "src/Bundle/ChillCustomFieldsBundle",
|
"Chill\\CustomFieldsBundle\\": "src/Bundle/ChillCustomFieldsBundle",
|
||||||
|
"Chill\\DocGeneratorBundle\\": "src/Bundle/ChillDocGeneratorBundle",
|
||||||
"Chill\\DocStoreBundle\\": "src/Bundle/ChillDocStoreBundle",
|
"Chill\\DocStoreBundle\\": "src/Bundle/ChillDocStoreBundle",
|
||||||
"Chill\\EventBundle\\": "src/Bundle/ChillEventBundle",
|
"Chill\\EventBundle\\": "src/Bundle/ChillEventBundle",
|
||||||
"Chill\\FamilyMemberBundle\\": "src/Bundle/ChillFamilyMemberBundle",
|
"Chill\\FamilyMemberBundle\\": "src/Bundle/ChillFamilyMemberBundle",
|
||||||
@@ -82,9 +87,6 @@
|
|||||||
"Chill\\ReportBundle\\": "src/Bundle/ChillReportBundle",
|
"Chill\\ReportBundle\\": "src/Bundle/ChillReportBundle",
|
||||||
"Chill\\TaskBundle\\": "src/Bundle/ChillTaskBundle",
|
"Chill\\TaskBundle\\": "src/Bundle/ChillTaskBundle",
|
||||||
"Chill\\ThirdPartyBundle\\": "src/Bundle/ChillThirdPartyBundle",
|
"Chill\\ThirdPartyBundle\\": "src/Bundle/ChillThirdPartyBundle",
|
||||||
"Chill\\AsideActivityBundle\\": "src/Bundle/ChillAsideActivityBundle/src",
|
|
||||||
"Chill\\DocGeneratorBundle\\": "src/Bundle/ChillDocGeneratorBundle",
|
|
||||||
"Chill\\CalendarBundle\\": "src/Bundle/ChillCalendarBundle",
|
|
||||||
"Chill\\WopiBundle\\": "src/Bundle/ChillWopiBundle/src"
|
"Chill\\WopiBundle\\": "src/Bundle/ChillWopiBundle/src"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -94,12 +96,23 @@
|
|||||||
"Chill\\DocGeneratorBundle\\Tests\\": "src/Bundle/ChillDocGeneratorBundle/tests"
|
"Chill\\DocGeneratorBundle\\Tests\\": "src/Bundle/ChillDocGeneratorBundle/tests"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"minimum-stability": "dev",
|
"config": {
|
||||||
"prefer-stable": true,
|
"allow-plugins": {
|
||||||
|
"composer/package-versions-deprecated": true,
|
||||||
|
"ergebnis/composer-normalize": true,
|
||||||
|
"ocramius/package-versions": true,
|
||||||
|
"phpro/grumphp": true,
|
||||||
|
"phpstan/extension-installer": true
|
||||||
|
},
|
||||||
|
"bin-dir": "bin",
|
||||||
|
"optimize-autoloader": true,
|
||||||
|
"sort-packages": true,
|
||||||
|
"vendor-dir": "tests/app/vendor"
|
||||||
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"auto-scripts": {
|
"auto-scripts": {
|
||||||
"cache:clear": "symfony-cmd",
|
"assets:install %PUBLIC_DIR%": "symfony-cmd",
|
||||||
"assets:install %PUBLIC_DIR%": "symfony-cmd"
|
"cache:clear": "symfony-cmd"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -91,7 +91,9 @@ class CountPerson implements ExportInterface
|
|||||||
public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
|
public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
|
||||||
{
|
{
|
||||||
// we gather all center the user choose.
|
// we gather all center the user choose.
|
||||||
$centers = array_map(static function ($el) { return $el['center']; }, $acl);
|
$centers = array_map(static function ($el) {
|
||||||
|
return $el['center'];
|
||||||
|
}, $acl);
|
||||||
|
|
||||||
$qb = $this->entityManager->createQueryBuilder();
|
$qb = $this->entityManager->createQueryBuilder();
|
||||||
|
|
||||||
|
@@ -11,53 +11,53 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace Chill\MainBundle\DependencyInjection;
|
namespace Chill\MainBundle\DependencyInjection;
|
||||||
|
|
||||||
use Chill\MainBundle\DependencyInjection\Widget\AddWidgetConfigurationTrait;
|
use Chill\MainBundle\DependencyInjection\Widget\AddWidgetConfigurationTrait;
|
||||||
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
|
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
|
||||||
use Symfony\Component\Config\Definition\ConfigurationInterface;
|
use Symfony\Component\Config\Definition\ConfigurationInterface;
|
||||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configure the main bundle.
|
* Configure the main bundle.
|
||||||
*/
|
*/
|
||||||
class ChillMainConfiguration implements ConfigurationInterface
|
class ChillMainConfiguration implements ConfigurationInterface
|
||||||
{
|
{
|
||||||
use AddWidgetConfigurationTrait;
|
use AddWidgetConfigurationTrait;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var ContainerBuilder
|
* @var ContainerBuilder
|
||||||
*/
|
*/
|
||||||
private $containerBuilder;
|
private $containerBuilder;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
array $widgetFactories,
|
array $widgetFactories,
|
||||||
ContainerBuilder $containerBuilder
|
ContainerBuilder $containerBuilder
|
||||||
) {
|
) {
|
||||||
// we register here widget factories (see below)
|
// we register here widget factories (see below)
|
||||||
$this->setWidgetFactories($widgetFactories);
|
$this->setWidgetFactories($widgetFactories);
|
||||||
// we will need the container builder later...
|
// we will need the container builder later...
|
||||||
$this->containerBuilder = $containerBuilder;
|
$this->containerBuilder = $containerBuilder;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getConfigTreeBuilder()
|
public function getConfigTreeBuilder()
|
||||||
{
|
{
|
||||||
$treeBuilder = new TreeBuilder();
|
$treeBuilder = new TreeBuilder();
|
||||||
$rootNode = $treeBuilder->root('chill_main');
|
$rootNode = $treeBuilder->root('chill_main');
|
||||||
|
|
||||||
$rootNode
|
$rootNode
|
||||||
->children()
|
->children()
|
||||||
|
|
||||||
// ...
|
// ...
|
||||||
->arrayNode('widgets')
|
->arrayNode('widgets')
|
||||||
->canBeDisabled()
|
->canBeDisabled()
|
||||||
->children()
|
->children()
|
||||||
// we declare here all configuration for homepage place
|
// we declare here all configuration for homepage place
|
||||||
->append($this->addWidgetsConfiguration('homepage', $this->containerBuilder))
|
->append($this->addWidgetsConfiguration('homepage', $this->containerBuilder))
|
||||||
->end() // end of widgets/children
|
->end() // end of widgets/children
|
||||||
->end() // end of widgets
|
->end() // end of widgets
|
||||||
->end() // end of root/children
|
->end() // end of root/children
|
||||||
->end() // end of root
|
->end() // end of root
|
||||||
;
|
;
|
||||||
|
|
||||||
return $treeBuilder;
|
return $treeBuilder;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
25
grumphp.yml
25
grumphp.yml
@@ -12,3 +12,28 @@ parameters:
|
|||||||
tasks.phpcsfixer.allow_risky: true
|
tasks.phpcsfixer.allow_risky: true
|
||||||
tasks.phpcsfixer.diff: true
|
tasks.phpcsfixer.diff: true
|
||||||
tasks.phpstan.level: 1
|
tasks.phpstan.level: 1
|
||||||
|
tasks.phpstan.blocking: true
|
||||||
|
tasks.phpstan.ignore_patterns:
|
||||||
|
- "/.github/"
|
||||||
|
- "/.idea/"
|
||||||
|
- "/build/"
|
||||||
|
- "/benchmarks/"
|
||||||
|
- "/docs/"
|
||||||
|
- "/node_modules/"
|
||||||
|
- "/resource/"
|
||||||
|
- "/spec/"
|
||||||
|
- "/var/"
|
||||||
|
- "/vendor/"
|
||||||
|
|
||||||
|
# Psalm
|
||||||
|
tasks.psalm.blocking: true
|
||||||
|
tasks.psalm.ignore_patterns:
|
||||||
|
- "/.github/"
|
||||||
|
- "/.idea/"
|
||||||
|
- "/build/"
|
||||||
|
- "/benchmarks/"
|
||||||
|
- "/node_modules/"
|
||||||
|
- "/resource/"
|
||||||
|
- "/spec/"
|
||||||
|
- "/var/"
|
||||||
|
- "/vendor/"
|
||||||
|
@@ -1,3 +0,0 @@
|
|||||||
add npm/yarn dependency in package.json :
|
|
||||||
|
|
||||||
"select2-bootstrap-theme": "0.1.0-beta.10",
|
|
@@ -10,16 +10,6 @@ parameters:
|
|||||||
count: 1
|
count: 1
|
||||||
path: src/Bundle/ChillCustomFieldsBundle/Controller/CustomFieldsGroupController.php
|
path: src/Bundle/ChillCustomFieldsBundle/Controller/CustomFieldsGroupController.php
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Instantiated class PhpOffice\\\\PhpWord\\\\TemplateProcessor not found\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorController.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Instantiated class PhpOffice\\\\PhpWord\\\\TemplateProcessor not found\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Variable \\$participation might not be defined\\.$#"
|
message: "#^Variable \\$participation might not be defined\\.$#"
|
||||||
count: 3
|
count: 3
|
||||||
@@ -90,11 +80,6 @@ parameters:
|
|||||||
count: 1
|
count: 1
|
||||||
path: src/Bundle/ChillPersonBundle/Form/ChoiceLoader/PersonChoiceLoader.php
|
path: src/Bundle/ChillPersonBundle/Form/ChoiceLoader/PersonChoiceLoader.php
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Foreach overwrites \\$action with its value variable\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodWorkRepository.php
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Foreach overwrites \\$action with its value variable\\.$#"
|
message: "#^Foreach overwrites \\$action with its value variable\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
|
@@ -30,36 +30,6 @@ parameters:
|
|||||||
count: 2
|
count: 2
|
||||||
path: src/Bundle/ChillPersonBundle/Household/MembersEditorFactory.php
|
path: src/Bundle/ChillPersonBundle/Household/MembersEditorFactory.php
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Parameter \\$action of method Chill\\\\PersonBundle\\\\Repository\\\\AccompanyingPeriod\\\\AccompanyingPeriodWorkRepository\\:\\:buildQueryBySocialActionWithDescendants\\(\\) has invalid type Chill\\\\PersonBundle\\\\Repository\\\\AccompanyingPeriod\\\\SocialAction\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodWorkRepository.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Parameter \\$action of method Chill\\\\PersonBundle\\\\Repository\\\\AccompanyingPeriod\\\\AccompanyingPeriodWorkRepository\\:\\:countBySocialActionWithDescendants\\(\\) has invalid type Chill\\\\PersonBundle\\\\Repository\\\\AccompanyingPeriod\\\\SocialAction\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodWorkRepository.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Undefined variable\\: \\$action$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodWorkRepository.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Undefined variable\\: \\$limit$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodWorkRepository.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Undefined variable\\: \\$offset$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodWorkRepository.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Undefined variable\\: \\$orderBy$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodWorkRepository.php
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Variable variables are not allowed\\.$#"
|
message: "#^Variable variables are not allowed\\.$#"
|
||||||
count: 4
|
count: 4
|
||||||
|
@@ -408,42 +408,6 @@ parameters:
|
|||||||
count: 1
|
count: 1
|
||||||
path: src/Bundle/ChillCustomFieldsBundle/Form/CustomFieldsGroupType.php
|
path: src/Bundle/ChillCustomFieldsBundle/Form/CustomFieldsGroupType.php
|
||||||
|
|
||||||
-
|
|
||||||
message:
|
|
||||||
"""
|
|
||||||
#^Call to deprecated method getReachableScopes\\(\\) of class Chill\\\\MainBundle\\\\Security\\\\Authorization\\\\AuthorizationHelper\\:
|
|
||||||
Use getReachableCircles$#
|
|
||||||
"""
|
|
||||||
count: 1
|
|
||||||
path: src/Bundle/ChillDocStoreBundle/Controller/DocumentPersonController.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message:
|
|
||||||
"""
|
|
||||||
#^Instantiation of deprecated class Symfony\\\\Component\\\\Security\\\\Core\\\\Role\\\\Role\\:
|
|
||||||
since Symfony 4\\.3, to be removed in 5\\.0\\. Use strings as roles instead\\.$#
|
|
||||||
"""
|
|
||||||
count: 3
|
|
||||||
path: src/Bundle/ChillDocStoreBundle/Controller/DocumentPersonController.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message:
|
|
||||||
"""
|
|
||||||
#^Parameter \\$translator of method Chill\\\\DocStoreBundle\\\\Controller\\\\DocumentPersonController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
|
|
||||||
since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
|
|
||||||
"""
|
|
||||||
count: 1
|
|
||||||
path: src/Bundle/ChillDocStoreBundle/Controller/DocumentPersonController.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message:
|
|
||||||
"""
|
|
||||||
#^Fetching class constant class of deprecated class Symfony\\\\Component\\\\Security\\\\Core\\\\Role\\\\Role\\:
|
|
||||||
since Symfony 4\\.3, to be removed in 5\\.0\\. Use strings as roles instead\\.$#
|
|
||||||
"""
|
|
||||||
count: 1
|
|
||||||
path: src/Bundle/ChillDocStoreBundle/Form/PersonDocumentType.php
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message:
|
message:
|
||||||
"""
|
"""
|
||||||
@@ -525,24 +489,6 @@ parameters:
|
|||||||
count: 1
|
count: 1
|
||||||
path: src/Bundle/ChillEventBundle/Search/EventSearch.php
|
path: src/Bundle/ChillEventBundle/Search/EventSearch.php
|
||||||
|
|
||||||
-
|
|
||||||
message:
|
|
||||||
"""
|
|
||||||
#^Instantiation of deprecated class Symfony\\\\Component\\\\Security\\\\Core\\\\Role\\\\Role\\:
|
|
||||||
since Symfony 4\\.3, to be removed in 5\\.0\\. Use strings as roles instead\\.$#
|
|
||||||
"""
|
|
||||||
count: 2
|
|
||||||
path: src/Bundle/ChillEventBundle/Search/EventSearch.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message:
|
|
||||||
"""
|
|
||||||
#^Instantiation of deprecated class Symfony\\\\Component\\\\Security\\\\Core\\\\Role\\\\Role\\:
|
|
||||||
since Symfony 4\\.3, to be removed in 5\\.0\\. Use strings as roles instead\\.$#
|
|
||||||
"""
|
|
||||||
count: 1
|
|
||||||
path: src/Bundle/ChillEventBundle/Timeline/TimelineEventProvider.php
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message:
|
message:
|
||||||
"""
|
"""
|
||||||
@@ -895,11 +841,6 @@ parameters:
|
|||||||
count: 1
|
count: 1
|
||||||
path: src/Bundle/ChillMainBundle/Security/PasswordRecover/PasswordRecoverEvent.php
|
path: src/Bundle/ChillMainBundle/Security/PasswordRecover/PasswordRecoverEvent.php
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Call to deprecated method setTimeout\\(\\) of class Redis\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Bundle/ChillMainBundle/Security/PasswordRecover/PasswordRecoverLocker.php
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message:
|
message:
|
||||||
"""
|
"""
|
||||||
@@ -968,15 +909,6 @@ parameters:
|
|||||||
count: 1
|
count: 1
|
||||||
path: src/Bundle/ChillPersonBundle/Controller/AccompanyingCourseController.php
|
path: src/Bundle/ChillPersonBundle/Controller/AccompanyingCourseController.php
|
||||||
|
|
||||||
-
|
|
||||||
message:
|
|
||||||
"""
|
|
||||||
#^Parameter \\$trans of method Chill\\\\PersonBundle\\\\Controller\\\\AccompanyingCourseWorkController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
|
|
||||||
since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
|
|
||||||
"""
|
|
||||||
count: 1
|
|
||||||
path: src/Bundle/ChillPersonBundle/Controller/AccompanyingCourseWorkController.php
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message:
|
message:
|
||||||
"""
|
"""
|
||||||
@@ -1311,16 +1243,6 @@ parameters:
|
|||||||
count: 1
|
count: 1
|
||||||
path: src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriodACLAwareRepository.php
|
path: src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriodACLAwareRepository.php
|
||||||
|
|
||||||
-
|
|
||||||
message:
|
|
||||||
"""
|
|
||||||
#^Instantiation of deprecated class Symfony\\\\Component\\\\Security\\\\Core\\\\Role\\\\Role\\:
|
|
||||||
since Symfony 4\\.3, to be removed in 5\\.0\\. Use strings as roles instead\\.$#
|
|
||||||
"""
|
|
||||||
count: 1
|
|
||||||
path: src/Bundle/ChillPersonBundle/Search/SimilarPersonMatcher.php
|
|
||||||
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message:
|
message:
|
||||||
"""
|
"""
|
||||||
|
@@ -315,11 +315,6 @@ parameters:
|
|||||||
count: 1
|
count: 1
|
||||||
path: src/Bundle/ChillMainBundle/Security/PasswordRecover/TokenManager.php
|
path: src/Bundle/ChillMainBundle/Security/PasswordRecover/TokenManager.php
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
|
|
||||||
count: 3
|
|
||||||
path: src/Bundle/ChillMainBundle/Templating/Entity/AddressRender.php
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
|
message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
@@ -405,11 +400,6 @@ parameters:
|
|||||||
count: 1
|
count: 1
|
||||||
path: src/Bundle/ChillPersonBundle/Form/Type/PersonPhoneType.php
|
path: src/Bundle/ChillPersonBundle/Form/Type/PersonPhoneType.php
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method Chill\\\\PersonBundle\\\\Repository\\\\AccompanyingPeriod\\\\AccompanyingPeriodWorkRepository\\:\\:buildQueryBySocialActionWithDescendants\\(\\) has invalid return type Chill\\\\PersonBundle\\\\Repository\\\\AccompanyingPeriod\\\\QueryBuilder\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodWorkRepository.php
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
|
message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
|
||||||
count: 3
|
count: 3
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<!-- https://phpunit.readthedocs.io/en/latest/configuration.html -->
|
<!-- https://phpunit.readthedocs.io/en/latest/configuration.html -->
|
||||||
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
|
xsi:noNamespaceSchemaLocation="tests/app/vendor/phpunit/phpunit/phpunit.xsd"
|
||||||
backupGlobals="false"
|
backupGlobals="false"
|
||||||
colors="true"
|
colors="true"
|
||||||
bootstrap="tests/app/tests/bootstrap.php"
|
bootstrap="tests/app/tests/bootstrap.php"
|
||||||
|
2006
psalm-baseline.xml
Normal file
2006
psalm-baseline.xml
Normal file
File diff suppressed because it is too large
Load Diff
16
psalm.xml
Normal file
16
psalm.xml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<psalm
|
||||||
|
errorLevel="7"
|
||||||
|
resolveFromConfigFile="true"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns="https://getpsalm.org/schema/config"
|
||||||
|
xsi:schemaLocation="https://getpsalm.org/schema/config tests/app/vendor/vimeo/psalm/config.xsd"
|
||||||
|
errorBaseline="psalm-baseline.xml"
|
||||||
|
>
|
||||||
|
<projectFiles>
|
||||||
|
<directory name="src" />
|
||||||
|
<ignoreFiles>
|
||||||
|
<directory name="./tests/" />
|
||||||
|
</ignoreFiles>
|
||||||
|
</projectFiles>
|
||||||
|
</psalm>
|
@@ -31,13 +31,16 @@ use DateTime;
|
|||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use InvalidArgumentException;
|
use InvalidArgumentException;
|
||||||
use Psr\Log\LoggerInterface;
|
use Psr\Log\LoggerInterface;
|
||||||
|
use RuntimeException;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
||||||
|
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
|
||||||
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
|
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
|
||||||
use Symfony\Component\Form\FormInterface;
|
use Symfony\Component\Form\FormInterface;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
use Symfony\Component\Security\Core\Role\Role;
|
use Symfony\Component\Security\Core\Role\Role;
|
||||||
|
|
||||||
use Symfony\Component\Serializer\SerializerInterface;
|
use Symfony\Component\Serializer\SerializerInterface;
|
||||||
use function array_key_exists;
|
use function array_key_exists;
|
||||||
|
|
||||||
@@ -198,12 +201,36 @@ final class ActivityController extends AbstractController
|
|||||||
'role' => new Role('CHILL_ACTIVITY_UPDATE'),
|
'role' => new Role('CHILL_ACTIVITY_UPDATE'),
|
||||||
'activityType' => $entity->getActivityType(),
|
'activityType' => $entity->getActivityType(),
|
||||||
'accompanyingPeriod' => $accompanyingPeriod,
|
'accompanyingPeriod' => $accompanyingPeriod,
|
||||||
])->handleRequest($request);
|
]);
|
||||||
|
|
||||||
|
if ($form->has('documents')) {
|
||||||
|
$form->add('gendocTemplateId', HiddenType::class, [
|
||||||
|
'mapped' => false,
|
||||||
|
'data' => null,
|
||||||
|
'attr' => [
|
||||||
|
// required for js
|
||||||
|
'data-template-id' => 'data-template-id',
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form->handleRequest($request);
|
||||||
|
|
||||||
if ($form->isSubmitted() && $form->isValid()) {
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
$this->entityManager->persist($entity);
|
$this->entityManager->persist($entity);
|
||||||
$this->entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
|
||||||
|
if ($form->has('gendocTemplateId') && null !== $form['gendocTemplateId']->getData()) {
|
||||||
|
return $this->redirectToRoute(
|
||||||
|
'chill_docgenerator_generate_from_template',
|
||||||
|
[
|
||||||
|
'template' => $form->get('gendocTemplateId')->getData(),
|
||||||
|
'entityClassName' => Activity::class,
|
||||||
|
'entityId' => $entity->getId(),
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
$this->addFlash('success', $this->get('translator')->trans('Success : activity updated!'));
|
$this->addFlash('success', $this->get('translator')->trans('Success : activity updated!'));
|
||||||
|
|
||||||
$params = $this->buildParamsToUrl($person, $accompanyingPeriod);
|
$params = $this->buildParamsToUrl($person, $accompanyingPeriod);
|
||||||
@@ -254,7 +281,7 @@ final class ActivityController extends AbstractController
|
|||||||
if ($person instanceof Person) {
|
if ($person instanceof Person) {
|
||||||
$this->denyAccessUnlessGranted(ActivityVoter::SEE, $person);
|
$this->denyAccessUnlessGranted(ActivityVoter::SEE, $person);
|
||||||
$activities = $this->activityACLAwareRepository
|
$activities = $this->activityACLAwareRepository
|
||||||
->findByPerson($person, ActivityVoter::SEE, 0, null);
|
->findByPerson($person, ActivityVoter::SEE, 0, null, ['date' => 'DESC', 'id' => 'DESC']);
|
||||||
|
|
||||||
$event = new PrivacyEvent($person, [
|
$event = new PrivacyEvent($person, [
|
||||||
'element_class' => Activity::class,
|
'element_class' => Activity::class,
|
||||||
@@ -267,7 +294,7 @@ final class ActivityController extends AbstractController
|
|||||||
$this->denyAccessUnlessGranted(ActivityVoter::SEE, $accompanyingPeriod);
|
$this->denyAccessUnlessGranted(ActivityVoter::SEE, $accompanyingPeriod);
|
||||||
|
|
||||||
$activities = $this->activityACLAwareRepository
|
$activities = $this->activityACLAwareRepository
|
||||||
->findByAccompanyingPeriod($accompanyingPeriod, ActivityVoter::SEE);
|
->findByAccompanyingPeriod($accompanyingPeriod, ActivityVoter::SEE, 0, null, ['date' => 'DESC', 'id' => 'DESC']);
|
||||||
|
|
||||||
$view = 'ChillActivityBundle:Activity:listAccompanyingCourse.html.twig';
|
$view = 'ChillActivityBundle:Activity:listAccompanyingCourse.html.twig';
|
||||||
}
|
}
|
||||||
@@ -307,8 +334,10 @@ final class ActivityController extends AbstractController
|
|||||||
$activityData = $request->query->get('activityData');
|
$activityData = $request->query->get('activityData');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$activityType instanceof \Chill\ActivityBundle\Entity\ActivityType
|
if (
|
||||||
|| !$activityType->isActive()) {
|
!$activityType instanceof \Chill\ActivityBundle\Entity\ActivityType
|
||||||
|
|| !$activityType->isActive()
|
||||||
|
) {
|
||||||
$params = $this->buildParamsToUrl($person, $accompanyingPeriod);
|
$params = $this->buildParamsToUrl($person, $accompanyingPeriod);
|
||||||
|
|
||||||
if (null !== $activityData) {
|
if (null !== $activityData) {
|
||||||
@@ -389,12 +418,36 @@ final class ActivityController extends AbstractController
|
|||||||
'role' => new Role('CHILL_ACTIVITY_CREATE'),
|
'role' => new Role('CHILL_ACTIVITY_CREATE'),
|
||||||
'activityType' => $entity->getActivityType(),
|
'activityType' => $entity->getActivityType(),
|
||||||
'accompanyingPeriod' => $accompanyingPeriod,
|
'accompanyingPeriod' => $accompanyingPeriod,
|
||||||
])->handleRequest($request);
|
]);
|
||||||
|
|
||||||
|
if ($form->has('documents')) {
|
||||||
|
$form->add('gendocTemplateId', HiddenType::class, [
|
||||||
|
'mapped' => false,
|
||||||
|
'data' => null,
|
||||||
|
'attr' => [
|
||||||
|
// required for js
|
||||||
|
'data-template-id' => 'data-template-id',
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form->handleRequest($request);
|
||||||
|
|
||||||
if ($form->isSubmitted() && $form->isValid()) {
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
$this->entityManager->persist($entity);
|
$this->entityManager->persist($entity);
|
||||||
$this->entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
|
||||||
|
if ($form->has('gendocTemplateId') && null !== $form['gendocTemplateId']->getData()) {
|
||||||
|
return $this->redirectToRoute(
|
||||||
|
'chill_docgenerator_generate_from_template',
|
||||||
|
[
|
||||||
|
'template' => $form->get('gendocTemplateId')->getData(),
|
||||||
|
'entityClassName' => Activity::class,
|
||||||
|
'entityId' => $entity->getId(),
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
$this->addFlash('success', $this->get('translator')->trans('Success : activity created!'));
|
$this->addFlash('success', $this->get('translator')->trans('Success : activity created!'));
|
||||||
|
|
||||||
$params = $this->buildParamsToUrl($person, $accompanyingPeriod);
|
$params = $this->buildParamsToUrl($person, $accompanyingPeriod);
|
||||||
@@ -468,20 +521,21 @@ final class ActivityController extends AbstractController
|
|||||||
|
|
||||||
public function showAction(Request $request, int $id): Response
|
public function showAction(Request $request, int $id): Response
|
||||||
{
|
{
|
||||||
$view = null;
|
$entity = $this->activityRepository->find($id);
|
||||||
|
|
||||||
[$person, $accompanyingPeriod] = $this->getEntity($request);
|
if (null === $entity) {
|
||||||
|
throw $this->createNotFoundException('Unable to find Activity entity.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$accompanyingPeriod = $entity->getAccompanyingPeriod();
|
||||||
|
$person = $entity->getPerson();
|
||||||
|
|
||||||
if ($accompanyingPeriod instanceof AccompanyingPeriod) {
|
if ($accompanyingPeriod instanceof AccompanyingPeriod) {
|
||||||
$view = 'ChillActivityBundle:Activity:showAccompanyingCourse.html.twig';
|
$view = 'ChillActivityBundle:Activity:showAccompanyingCourse.html.twig';
|
||||||
} elseif ($person instanceof Person) {
|
} elseif ($person instanceof Person) {
|
||||||
$view = 'ChillActivityBundle:Activity:showPerson.html.twig';
|
$view = 'ChillActivityBundle:Activity:showPerson.html.twig';
|
||||||
}
|
} else {
|
||||||
|
throw new RuntimeException('the activity should be linked with a period or person');
|
||||||
$entity = $this->activityRepository->find($id);
|
|
||||||
|
|
||||||
if (null === $entity) {
|
|
||||||
throw $this->createNotFoundException('Unable to find Activity entity.');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null !== $accompanyingPeriod) {
|
if (null !== $accompanyingPeriod) {
|
||||||
@@ -490,8 +544,7 @@ final class ActivityController extends AbstractController
|
|||||||
$entity->personsNotAssociated = $entity->getPersonsNotAssociated();
|
$entity->personsNotAssociated = $entity->getPersonsNotAssociated();
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO revoir le Voter de Activity pour tenir compte qu'une activité peut appartenir a une période
|
$this->denyAccessUnlessGranted(ActivityVoter::SEE, $entity);
|
||||||
// $this->denyAccessUnlessGranted('CHILL_ACTIVITY_SEE', $entity);
|
|
||||||
|
|
||||||
$deleteForm = $this->createDeleteForm($entity->getId(), $person, $accompanyingPeriod);
|
$deleteForm = $this->createDeleteForm($entity->getId(), $person, $accompanyingPeriod);
|
||||||
|
|
||||||
|
@@ -14,7 +14,6 @@ namespace Chill\ActivityBundle\Controller;
|
|||||||
use Chill\ActivityBundle\Entity\ActivityReasonCategory;
|
use Chill\ActivityBundle\Entity\ActivityReasonCategory;
|
||||||
use Chill\ActivityBundle\Form\ActivityReasonCategoryType;
|
use Chill\ActivityBundle\Form\ActivityReasonCategoryType;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
|
|
||||||
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
|
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
|
||||||
|
@@ -14,7 +14,6 @@ namespace Chill\ActivityBundle\Controller;
|
|||||||
use Chill\ActivityBundle\Entity\ActivityReason;
|
use Chill\ActivityBundle\Entity\ActivityReason;
|
||||||
use Chill\ActivityBundle\Form\ActivityReasonType;
|
use Chill\ActivityBundle\Form\ActivityReasonType;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
|
|
||||||
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
|
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
|
||||||
|
@@ -19,6 +19,7 @@ use Chill\MainBundle\Entity\RoleScope;
|
|||||||
use Doctrine\Common\DataFixtures\AbstractFixture;
|
use Doctrine\Common\DataFixtures\AbstractFixture;
|
||||||
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
|
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
|
||||||
use Doctrine\Persistence\ObjectManager;
|
use Doctrine\Persistence\ObjectManager;
|
||||||
|
|
||||||
use function in_array;
|
use function in_array;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -41,6 +41,7 @@ class ChillActivityExtension extends Extension implements PrependExtensionInterf
|
|||||||
$loader->load('services/form.yaml');
|
$loader->load('services/form.yaml');
|
||||||
$loader->load('services/templating.yaml');
|
$loader->load('services/templating.yaml');
|
||||||
$loader->load('services/accompanyingPeriodConsistency.yaml');
|
$loader->load('services/accompanyingPeriodConsistency.yaml');
|
||||||
|
$loader->load('services/doctrine.entitylistener.yaml');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function prepend(ContainerBuilder $container)
|
public function prepend(ContainerBuilder $container)
|
||||||
|
@@ -13,6 +13,7 @@ namespace Chill\ActivityBundle\DependencyInjection;
|
|||||||
|
|
||||||
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
|
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
|
||||||
use Symfony\Component\Config\Definition\ConfigurationInterface;
|
use Symfony\Component\Config\Definition\ConfigurationInterface;
|
||||||
|
|
||||||
use function is_int;
|
use function is_int;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -12,7 +12,7 @@ declare(strict_types=1);
|
|||||||
namespace Chill\ActivityBundle\Entity;
|
namespace Chill\ActivityBundle\Entity;
|
||||||
|
|
||||||
use Chill\ActivityBundle\Validator\Constraints as ActivityValidator;
|
use Chill\ActivityBundle\Validator\Constraints as ActivityValidator;
|
||||||
use Chill\DocStoreBundle\Entity\Document;
|
use Chill\DocStoreBundle\Entity\StoredObject;
|
||||||
use Chill\MainBundle\Entity\Center;
|
use Chill\MainBundle\Entity\Center;
|
||||||
use Chill\MainBundle\Entity\Embeddable\CommentEmbeddable;
|
use Chill\MainBundle\Entity\Embeddable\CommentEmbeddable;
|
||||||
use Chill\MainBundle\Entity\HasCenterInterface;
|
use Chill\MainBundle\Entity\HasCenterInterface;
|
||||||
@@ -47,7 +47,8 @@ use Symfony\Component\Serializer\Annotation\SerializedName;
|
|||||||
* })
|
* })
|
||||||
* @ActivityValidator\ActivityValidity
|
* @ActivityValidator\ActivityValidity
|
||||||
*
|
*
|
||||||
* @UserCircleConsistency(
|
* TODO see if necessary
|
||||||
|
* UserCircleConsistency(
|
||||||
* "CHILL_ACTIVITY_SEE_DETAILS",
|
* "CHILL_ACTIVITY_SEE_DETAILS",
|
||||||
* getUserFunction="getUser",
|
* getUserFunction="getUser",
|
||||||
* path="scope")
|
* path="scope")
|
||||||
@@ -66,7 +67,7 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToOne(targetEntity="Chill\ActivityBundle\Entity\ActivityType")
|
* @ORM\ManyToOne(targetEntity="Chill\ActivityBundle\Entity\ActivityType")
|
||||||
* @Groups({"read"})
|
* @Groups({"read", "docgen:read"})
|
||||||
* @SerializedName("activityType")
|
* @SerializedName("activityType")
|
||||||
* @ORM\JoinColumn(name="type_id")
|
* @ORM\JoinColumn(name="type_id")
|
||||||
*/
|
*/
|
||||||
@@ -74,16 +75,19 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToOne(targetEntity="Chill\ActivityBundle\Entity\ActivityPresence")
|
* @ORM\ManyToOne(targetEntity="Chill\ActivityBundle\Entity\ActivityPresence")
|
||||||
|
* @Groups({"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private ?ActivityPresence $attendee = null;
|
private ?ActivityPresence $attendee = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Embedded(class="Chill\MainBundle\Entity\Embeddable\CommentEmbeddable", columnPrefix="comment_")
|
* @ORM\Embedded(class="Chill\MainBundle\Entity\Embeddable\CommentEmbeddable", columnPrefix="comment_")
|
||||||
|
* @Groups({"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private CommentEmbeddable $comment;
|
private CommentEmbeddable $comment;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="datetime")
|
* @ORM\Column(type="datetime")
|
||||||
|
* @Groups({"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private DateTime $date;
|
private DateTime $date;
|
||||||
|
|
||||||
@@ -99,6 +103,7 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="boolean", options={"default": false})
|
* @ORM\Column(type="boolean", options={"default": false})
|
||||||
|
* @Groups({"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private bool $emergency = false;
|
private bool $emergency = false;
|
||||||
|
|
||||||
@@ -106,13 +111,13 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
* @ORM\Id
|
* @ORM\Id
|
||||||
* @ORM\Column(name="id", type="integer")
|
* @ORM\Column(name="id", type="integer")
|
||||||
* @ORM\GeneratedValue(strategy="AUTO")
|
* @ORM\GeneratedValue(strategy="AUTO")
|
||||||
* @Groups({"read"})
|
* @Groups({"read", "docgen:read"})
|
||||||
*/
|
*/
|
||||||
private ?int $id = null;
|
private ?int $id = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\Location")
|
* @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\Location")
|
||||||
* @groups({"read"})
|
* @groups({"read", "docgen:read"})
|
||||||
*/
|
*/
|
||||||
private ?Location $location = null;
|
private ?Location $location = null;
|
||||||
|
|
||||||
@@ -123,42 +128,45 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToMany(targetEntity="Chill\PersonBundle\Entity\Person")
|
* @ORM\ManyToMany(targetEntity="Chill\PersonBundle\Entity\Person")
|
||||||
* @Groups({"read"})
|
* @Groups({"read", "docgen:read"})
|
||||||
*/
|
*/
|
||||||
private ?Collection $persons = null;
|
private ?Collection $persons = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToMany(targetEntity="Chill\ActivityBundle\Entity\ActivityReason")
|
* @ORM\ManyToMany(targetEntity="Chill\ActivityBundle\Entity\ActivityReason")
|
||||||
|
* @Groups({"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private Collection $reasons;
|
private Collection $reasons;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\Scope")
|
* @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\Scope")
|
||||||
|
* @Groups({"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private ?Scope $scope = null;
|
private ?Scope $scope = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="string", options={"default": ""})
|
* @ORM\Column(type="string", options={"default": ""})
|
||||||
|
* @Groups({"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private string $sentReceived = '';
|
private string $sentReceived = '';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToMany(targetEntity="Chill\PersonBundle\Entity\SocialWork\SocialAction")
|
* @ORM\ManyToMany(targetEntity="Chill\PersonBundle\Entity\SocialWork\SocialAction")
|
||||||
* @ORM\JoinTable(name="chill_activity_activity_chill_person_socialaction")
|
* @ORM\JoinTable(name="chill_activity_activity_chill_person_socialaction")
|
||||||
* @Groups({"read"})
|
* @Groups({"read", "docgen:read"})
|
||||||
*/
|
*/
|
||||||
private Collection $socialActions;
|
private Collection $socialActions;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToMany(targetEntity="Chill\PersonBundle\Entity\SocialWork\SocialIssue")
|
* @ORM\ManyToMany(targetEntity="Chill\PersonBundle\Entity\SocialWork\SocialIssue")
|
||||||
* @ORM\JoinTable(name="chill_activity_activity_chill_person_socialissue")
|
* @ORM\JoinTable(name="chill_activity_activity_chill_person_socialissue")
|
||||||
* @Groups({"read"})
|
* @Groups({"read", "docgen:read"})
|
||||||
*/
|
*/
|
||||||
private Collection $socialIssues;
|
private Collection $socialIssues;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToMany(targetEntity="Chill\ThirdPartyBundle\Entity\ThirdParty")
|
* @ORM\ManyToMany(targetEntity="Chill\ThirdPartyBundle\Entity\ThirdParty")
|
||||||
* @Groups({"read"})
|
* @Groups({"read", "docgen:read"})
|
||||||
*/
|
*/
|
||||||
private ?Collection $thirdParties = null;
|
private ?Collection $thirdParties = null;
|
||||||
|
|
||||||
@@ -169,12 +177,13 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\User")
|
* @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\User")
|
||||||
|
* @Groups({"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private User $user;
|
private User $user;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToMany(targetEntity="Chill\MainBundle\Entity\User")
|
* @ORM\ManyToMany(targetEntity="Chill\MainBundle\Entity\User")
|
||||||
* @Groups({"read"})
|
* @Groups({"read", "docgen:read"})
|
||||||
*/
|
*/
|
||||||
private ?Collection $users = null;
|
private ?Collection $users = null;
|
||||||
|
|
||||||
@@ -190,7 +199,7 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
$this->socialActions = new ArrayCollection();
|
$this->socialActions = new ArrayCollection();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addDocument(Document $document): self
|
public function addDocument(StoredObject $document): self
|
||||||
{
|
{
|
||||||
$this->documents[] = $document;
|
$this->documents[] = $document;
|
||||||
|
|
||||||
@@ -301,6 +310,18 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
return $this->documents;
|
return $this->documents;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Groups({"docgen:read"})
|
||||||
|
*/
|
||||||
|
public function getDurationMinute(): int
|
||||||
|
{
|
||||||
|
if (null === $this->durationTime) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (int) round(($this->durationTime->getTimestamp() + $this->durationTime->getOffset()) / 60.0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
public function getDurationTime(): ?DateTime
|
public function getDurationTime(): ?DateTime
|
||||||
{
|
{
|
||||||
return $this->durationTime;
|
return $this->durationTime;
|
||||||
@@ -401,6 +422,18 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
return $this->travelTime;
|
return $this->travelTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Groups({"docgen:read"})
|
||||||
|
*/
|
||||||
|
public function getTravelTimeMinute(): int
|
||||||
|
{
|
||||||
|
if (null === $this->travelTime) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (int) round(($this->travelTime->getTimestamp() + $this->travelTime->getOffset()) / 60.0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated
|
* @deprecated
|
||||||
*/
|
*/
|
||||||
@@ -424,7 +457,7 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
return $this->getEmergency();
|
return $this->getEmergency();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function removeDocument(Document $document): void
|
public function removeDocument(StoredObject $document): void
|
||||||
{
|
{
|
||||||
$this->documents->removeElement($document);
|
$this->documents->removeElement($document);
|
||||||
}
|
}
|
||||||
|
@@ -12,6 +12,7 @@ declare(strict_types=1);
|
|||||||
namespace Chill\ActivityBundle\Entity;
|
namespace Chill\ActivityBundle\Entity;
|
||||||
|
|
||||||
use Doctrine\ORM\Mapping as ORM;
|
use Doctrine\ORM\Mapping as ORM;
|
||||||
|
use Symfony\Component\Serializer\Annotation as Serializer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class ActivityPresence.
|
* Class ActivityPresence.
|
||||||
@@ -31,11 +32,14 @@ class ActivityPresence
|
|||||||
* @ORM\Id
|
* @ORM\Id
|
||||||
* @ORM\Column(name="id", type="integer")
|
* @ORM\Column(name="id", type="integer")
|
||||||
* @ORM\GeneratedValue(strategy="AUTO")
|
* @ORM\GeneratedValue(strategy="AUTO")
|
||||||
|
* @Serializer\Groups({"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private ?int $id;
|
private ?int $id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="json")
|
* @ORM\Column(type="json")
|
||||||
|
* @Serializer\Groups({"docgen:read"})
|
||||||
|
* @Serializer\Context({"is-translatable": true}, groups={"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private array $name = [];
|
private array $name = [];
|
||||||
|
|
||||||
|
@@ -13,8 +13,10 @@ namespace Chill\ActivityBundle\Entity;
|
|||||||
|
|
||||||
use Doctrine\ORM\Mapping as ORM;
|
use Doctrine\ORM\Mapping as ORM;
|
||||||
use InvalidArgumentException;
|
use InvalidArgumentException;
|
||||||
|
use Symfony\Component\Serializer\Annotation as Serializer;
|
||||||
use Symfony\Component\Serializer\Annotation\Groups;
|
use Symfony\Component\Serializer\Annotation\Groups;
|
||||||
use Symfony\Component\Validator\Constraints as Assert;
|
use Symfony\Component\Validator\Constraints as Assert;
|
||||||
|
use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class ActivityType.
|
* Class ActivityType.
|
||||||
@@ -118,6 +120,7 @@ class ActivityType
|
|||||||
* @ORM\Id
|
* @ORM\Id
|
||||||
* @ORM\Column(name="id", type="integer")
|
* @ORM\Column(name="id", type="integer")
|
||||||
* @ORM\GeneratedValue(strategy="AUTO")
|
* @ORM\GeneratedValue(strategy="AUTO")
|
||||||
|
* @Groups({"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private ?int $id;
|
private ?int $id;
|
||||||
|
|
||||||
@@ -133,7 +136,8 @@ class ActivityType
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="json")
|
* @ORM\Column(type="json")
|
||||||
* @Groups({"read"})
|
* @Groups({"read", "docgen:read"})
|
||||||
|
* @Serializer\Context({"is-translatable": true}, groups={"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private array $name = [];
|
private array $name = [];
|
||||||
|
|
||||||
@@ -163,16 +167,6 @@ class ActivityType
|
|||||||
*/
|
*/
|
||||||
private int $personVisible = self::FIELD_REQUIRED;
|
private int $personVisible = self::FIELD_REQUIRED;
|
||||||
|
|
||||||
/**
|
|
||||||
* @ORM\Column(type="string", nullable=false, options={"default": ""})
|
|
||||||
*/
|
|
||||||
private string $placeLabel = '';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ORM\Column(type="smallint", nullable=false, options={"default": 1})
|
|
||||||
*/
|
|
||||||
private int $placeVisible = self::FIELD_OPTIONAL;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="string", nullable=false, options={"default": ""})
|
* @ORM\Column(type="string", nullable=false, options={"default": ""})
|
||||||
*/
|
*/
|
||||||
@@ -200,7 +194,6 @@ class ActivityType
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="smallint", nullable=false, options={"default": 1})
|
* @ORM\Column(type="smallint", nullable=false, options={"default": 1})
|
||||||
* @Assert\EqualTo(propertyPath="socialIssuesVisible", message="This parameter must be equal to social issue parameter")
|
|
||||||
*/
|
*/
|
||||||
private int $socialActionsVisible = self::FIELD_INVISIBLE;
|
private int $socialActionsVisible = self::FIELD_INVISIBLE;
|
||||||
|
|
||||||
@@ -270,6 +263,23 @@ class ActivityType
|
|||||||
*/
|
*/
|
||||||
private int $userVisible = self::FIELD_REQUIRED;
|
private int $userVisible = self::FIELD_REQUIRED;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Assert\Callback
|
||||||
|
*
|
||||||
|
* @param mixed $payload
|
||||||
|
*/
|
||||||
|
public function checkSocialActionsVisibility(ExecutionContextInterface $context, $payload)
|
||||||
|
{
|
||||||
|
if ($this->socialIssuesVisible !== $this->socialActionsVisible) {
|
||||||
|
if (!(2 === $this->socialIssuesVisible && 1 === $this->socialActionsVisible)) {
|
||||||
|
$context
|
||||||
|
->buildViolation('The socialActionsVisible value is not compatible with the socialIssuesVisible value')
|
||||||
|
->atPath('socialActionsVisible')
|
||||||
|
->addViolation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get active
|
* Get active
|
||||||
* return true if the type is active.
|
* return true if the type is active.
|
||||||
@@ -406,16 +416,6 @@ class ActivityType
|
|||||||
return $this->personVisible;
|
return $this->personVisible;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getPlaceLabel(): string
|
|
||||||
{
|
|
||||||
return $this->placeLabel;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getPlaceVisible(): int
|
|
||||||
{
|
|
||||||
return $this->placeVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getReasonsLabel(): string
|
public function getReasonsLabel(): string
|
||||||
{
|
{
|
||||||
return $this->reasonsLabel;
|
return $this->reasonsLabel;
|
||||||
@@ -688,20 +688,6 @@ class ActivityType
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setPlaceLabel(string $placeLabel): self
|
|
||||||
{
|
|
||||||
$this->placeLabel = $placeLabel;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setPlaceVisible(int $placeVisible): self
|
|
||||||
{
|
|
||||||
$this->placeVisible = $placeVisible;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setReasonsLabel(string $reasonsLabel): self
|
public function setReasonsLabel(string $reasonsLabel): self
|
||||||
{
|
{
|
||||||
$this->reasonsLabel = $reasonsLabel;
|
$this->reasonsLabel = $reasonsLabel;
|
||||||
|
@@ -0,0 +1,77 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Chill\ActivityBundle\EntityListener;
|
||||||
|
|
||||||
|
use Chill\ActivityBundle\Entity\Activity;
|
||||||
|
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
||||||
|
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork;
|
||||||
|
use Chill\PersonBundle\Repository\AccompanyingPeriod\AccompanyingPeriodWorkRepository;
|
||||||
|
use DateTimeImmutable;
|
||||||
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
|
||||||
|
use function in_array;
|
||||||
|
|
||||||
|
class ActivityEntityListener
|
||||||
|
{
|
||||||
|
private EntityManagerInterface $em;
|
||||||
|
|
||||||
|
private AccompanyingPeriodWorkRepository $workRepository;
|
||||||
|
|
||||||
|
public function __construct(EntityManagerInterface $em, AccompanyingPeriodWorkRepository $workRepository)
|
||||||
|
{
|
||||||
|
$this->em = $em;
|
||||||
|
$this->workRepository = $workRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function persistActionToCourse(Activity $activity)
|
||||||
|
{
|
||||||
|
if ($activity->getAccompanyingPeriod() instanceof AccompanyingPeriod) {
|
||||||
|
$period = $activity->getAccompanyingPeriod();
|
||||||
|
|
||||||
|
$accompanyingCourseWorks = $this->workRepository->findByAccompanyingPeriod($period);
|
||||||
|
$periodActions = [];
|
||||||
|
$now = new DateTimeImmutable();
|
||||||
|
|
||||||
|
foreach ($accompanyingCourseWorks as $key => $work) {
|
||||||
|
// take only the actions which are still opened
|
||||||
|
if ($work->getEndDate() === null || $work->getEndDate() > ($activity->getDate() ?? $now)) {
|
||||||
|
$periodActions[$key] = spl_object_hash($work->getSocialAction());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$associatedPersons = $activity->getPersonsAssociated();
|
||||||
|
$associatedThirdparties = $activity->getThirdParties();
|
||||||
|
|
||||||
|
foreach ($activity->getSocialActions() as $action) {
|
||||||
|
if (in_array(spl_object_hash($action), $periodActions, true)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$newAction = new AccompanyingPeriodWork();
|
||||||
|
$newAction->setSocialAction($action);
|
||||||
|
$period->addWork($newAction);
|
||||||
|
|
||||||
|
$date = DateTimeImmutable::createFromMutable($activity->getDate());
|
||||||
|
$newAction->setStartDate($date);
|
||||||
|
|
||||||
|
foreach ($associatedPersons as $person) {
|
||||||
|
$newAction->addPerson($person);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($associatedThirdparties as $thirdparty) {
|
||||||
|
$newAction->setHandlingThierparty($thirdparty);
|
||||||
|
}
|
||||||
|
$this->em->persist($newAction);
|
||||||
|
$this->em->flush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -25,6 +25,7 @@ use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
|||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
use Symfony\Component\Security\Core\Role\Role;
|
use Symfony\Component\Security\Core\Role\Role;
|
||||||
use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
||||||
|
|
||||||
use function array_key_exists;
|
use function array_key_exists;
|
||||||
use function count;
|
use function count;
|
||||||
|
|
||||||
|
@@ -27,6 +27,7 @@ use Symfony\Component\Security\Core\Role\Role;
|
|||||||
use Symfony\Component\Translation\TranslatorInterface;
|
use Symfony\Component\Translation\TranslatorInterface;
|
||||||
use Symfony\Component\Validator\Constraints\Callback;
|
use Symfony\Component\Validator\Constraints\Callback;
|
||||||
use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
||||||
|
|
||||||
use function array_key_exists;
|
use function array_key_exists;
|
||||||
use function count;
|
use function count;
|
||||||
use function in_array;
|
use function in_array;
|
||||||
@@ -189,7 +190,9 @@ class ListActivity implements ListInterface
|
|||||||
|
|
||||||
public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
|
public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
|
||||||
{
|
{
|
||||||
$centers = array_map(static function ($el) { return $el['center']; }, $acl);
|
$centers = array_map(static function ($el) {
|
||||||
|
return $el['center'];
|
||||||
|
}, $acl);
|
||||||
|
|
||||||
// throw an error if any fields are present
|
// throw an error if any fields are present
|
||||||
if (!array_key_exists('fields', $data)) {
|
if (!array_key_exists('fields', $data)) {
|
||||||
|
@@ -25,6 +25,7 @@ use Symfony\Bridge\Doctrine\Form\Type\EntityType;
|
|||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
use Symfony\Component\Security\Core\Role\Role;
|
use Symfony\Component\Security\Core\Role\Role;
|
||||||
use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
||||||
|
|
||||||
use function array_key_exists;
|
use function array_key_exists;
|
||||||
use function count;
|
use function count;
|
||||||
|
|
||||||
|
@@ -24,6 +24,7 @@ use Symfony\Bridge\Doctrine\Form\Type\EntityType;
|
|||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
use Symfony\Component\Security\Core\Role\Role;
|
use Symfony\Component\Security\Core\Role\Role;
|
||||||
use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
||||||
|
|
||||||
use function count;
|
use function count;
|
||||||
|
|
||||||
class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInterface
|
class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInterface
|
||||||
|
@@ -31,6 +31,7 @@ use Symfony\Component\Form\FormEvents;
|
|||||||
use Symfony\Component\Form\FormInterface;
|
use Symfony\Component\Form\FormInterface;
|
||||||
use Symfony\Component\Translation\TranslatorInterface;
|
use Symfony\Component\Translation\TranslatorInterface;
|
||||||
use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
||||||
|
|
||||||
use function count;
|
use function count;
|
||||||
|
|
||||||
class PersonHavingActivityBetweenDateFilter implements ExportElementValidatedInterface, FilterInterface
|
class PersonHavingActivityBetweenDateFilter implements ExportElementValidatedInterface, FilterInterface
|
||||||
|
@@ -48,6 +48,7 @@ use Symfony\Component\Form\FormEvent;
|
|||||||
use Symfony\Component\Form\FormEvents;
|
use Symfony\Component\Form\FormEvents;
|
||||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||||
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
|
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
|
||||||
|
|
||||||
use function in_array;
|
use function in_array;
|
||||||
|
|
||||||
class ActivityType extends AbstractType
|
class ActivityType extends AbstractType
|
||||||
@@ -260,6 +261,10 @@ class ActivityType extends AbstractType
|
|||||||
return implode(',', $personIds);
|
return implode(',', $personIds);
|
||||||
},
|
},
|
||||||
function (?string $personsAsString): array {
|
function (?string $personsAsString): array {
|
||||||
|
if (null === $personsAsString) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
return array_map(
|
return array_map(
|
||||||
fn (string $id): ?Person => $this->om->getRepository(Person::class)->findOneBy(['id' => (int) $id]),
|
fn (string $id): ?Person => $this->om->getRepository(Person::class)->findOneBy(['id' => (int) $id]),
|
||||||
explode(',', $personsAsString)
|
explode(',', $personsAsString)
|
||||||
@@ -282,6 +287,10 @@ class ActivityType extends AbstractType
|
|||||||
return implode(',', $thirdpartyIds);
|
return implode(',', $thirdpartyIds);
|
||||||
},
|
},
|
||||||
function (?string $thirdpartyAsString): array {
|
function (?string $thirdpartyAsString): array {
|
||||||
|
if (null === $thirdpartyAsString) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
return array_map(
|
return array_map(
|
||||||
fn (string $id): ?ThirdParty => $this->om->getRepository(ThirdParty::class)->findOneBy(['id' => (int) $id]),
|
fn (string $id): ?ThirdParty => $this->om->getRepository(ThirdParty::class)->findOneBy(['id' => (int) $id]),
|
||||||
explode(',', $thirdpartyAsString)
|
explode(',', $thirdpartyAsString)
|
||||||
@@ -298,6 +307,7 @@ class ActivityType extends AbstractType
|
|||||||
'allow_add' => true,
|
'allow_add' => true,
|
||||||
'button_add_label' => 'activity.Insert a document',
|
'button_add_label' => 'activity.Insert a document',
|
||||||
'button_remove_label' => 'activity.Remove a document',
|
'button_remove_label' => 'activity.Remove a document',
|
||||||
|
'empty_collection_explain' => 'No documents',
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -315,6 +325,10 @@ class ActivityType extends AbstractType
|
|||||||
return implode(',', $userIds);
|
return implode(',', $userIds);
|
||||||
},
|
},
|
||||||
function (?string $usersAsString): array {
|
function (?string $usersAsString): array {
|
||||||
|
if (null === $usersAsString) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
return array_map(
|
return array_map(
|
||||||
fn (string $id): ?User => $this->om->getRepository(User::class)->findOneBy(['id' => (int) $id]),
|
fn (string $id): ?User => $this->om->getRepository(User::class)->findOneBy(['id' => (int) $id]),
|
||||||
explode(',', $usersAsString)
|
explode(',', $usersAsString)
|
||||||
@@ -332,7 +346,7 @@ class ActivityType extends AbstractType
|
|||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
return $location->getId();
|
return (string) $location->getId();
|
||||||
},
|
},
|
||||||
function (?string $id): ?Location {
|
function (?string $id): ?Location {
|
||||||
return $this->om->getRepository(Location::class)->findOneBy(['id' => (int) $id]);
|
return $this->om->getRepository(Location::class)->findOneBy(['id' => (int) $id]);
|
||||||
@@ -379,7 +393,7 @@ class ActivityType extends AbstractType
|
|||||||
$timezoneUTC = new DateTimeZone('GMT');
|
$timezoneUTC = new DateTimeZone('GMT');
|
||||||
/** @var DateTime $data */
|
/** @var DateTime $data */
|
||||||
$data = $formEvent->getData() === null ?
|
$data = $formEvent->getData() === null ?
|
||||||
DateTime::createFromFormat('U', 300) :
|
DateTime::createFromFormat('U', '300') :
|
||||||
$formEvent->getData();
|
$formEvent->getData();
|
||||||
$seconds = $data->getTimezone()->getOffset($data);
|
$seconds = $data->getTimezone()->getOffset($data);
|
||||||
$data->setTimeZone($timezoneUTC);
|
$data->setTimeZone($timezoneUTC);
|
||||||
|
@@ -55,7 +55,7 @@ class ActivityTypeType extends AbstractType
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
$fields = [
|
$fields = [
|
||||||
'persons', 'user', 'date', 'place', 'persons',
|
'persons', 'user', 'date', 'location', 'persons',
|
||||||
'thirdParties', 'durationTime', 'travelTime', 'attendee',
|
'thirdParties', 'durationTime', 'travelTime', 'attendee',
|
||||||
'reasons', 'comment', 'sentReceived', 'documents',
|
'reasons', 'comment', 'sentReceived', 'documents',
|
||||||
'emergency', 'socialIssues', 'socialActions', 'users',
|
'emergency', 'socialIssues', 'socialActions', 'users',
|
||||||
|
@@ -36,8 +36,10 @@ class AccompanyingCourseMenuBuilder implements LocalMenuBuilderInterface
|
|||||||
{
|
{
|
||||||
$period = $parameters['accompanyingCourse'];
|
$period = $parameters['accompanyingCourse'];
|
||||||
|
|
||||||
if (AccompanyingPeriod::STEP_DRAFT !== $period->getStep()
|
if (
|
||||||
&& $this->security->isGranted(ActivityVoter::SEE, $period)) {
|
AccompanyingPeriod::STEP_DRAFT !== $period->getStep()
|
||||||
|
&& $this->security->isGranted(ActivityVoter::SEE, $period)
|
||||||
|
) {
|
||||||
$menu->addChild($this->translator->trans('Activity'), [
|
$menu->addChild($this->translator->trans('Activity'), [
|
||||||
'route' => 'chill_activity_activity_list',
|
'route' => 'chill_activity_activity_list',
|
||||||
'routeParameters' => [
|
'routeParameters' => [
|
||||||
|
@@ -14,6 +14,7 @@ namespace Chill\ActivityBundle\Menu;
|
|||||||
use Chill\MainBundle\Routing\LocalMenuBuilderInterface;
|
use Chill\MainBundle\Routing\LocalMenuBuilderInterface;
|
||||||
use Knp\Menu\MenuItem;
|
use Knp\Menu\MenuItem;
|
||||||
use Symfony\Component\Security\Core\Security;
|
use Symfony\Component\Security\Core\Security;
|
||||||
|
|
||||||
use function in_array;
|
use function in_array;
|
||||||
|
|
||||||
final class AdminMenuBuilder implements LocalMenuBuilderInterface
|
final class AdminMenuBuilder implements LocalMenuBuilderInterface
|
||||||
|
@@ -15,19 +15,13 @@ use Chill\ActivityBundle\Security\Authorization\ActivityVoter;
|
|||||||
use Chill\MainBundle\Routing\LocalMenuBuilderInterface;
|
use Chill\MainBundle\Routing\LocalMenuBuilderInterface;
|
||||||
use Knp\Menu\MenuItem;
|
use Knp\Menu\MenuItem;
|
||||||
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
|
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
|
||||||
use Symfony\Component\Translation\TranslatorInterface;
|
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||||
|
|
||||||
class PersonMenuBuilder implements LocalMenuBuilderInterface
|
class PersonMenuBuilder implements LocalMenuBuilderInterface
|
||||||
{
|
{
|
||||||
/**
|
protected AuthorizationCheckerInterface $authorizationChecker;
|
||||||
* @var AuthorizationCheckerInterface
|
|
||||||
*/
|
|
||||||
protected $authorizationChecker;
|
|
||||||
|
|
||||||
/**
|
protected TranslatorInterface $translator;
|
||||||
* @var TranslatorInterface
|
|
||||||
*/
|
|
||||||
protected $translator;
|
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
AuthorizationCheckerInterface $authorizationChecker,
|
AuthorizationCheckerInterface $authorizationChecker,
|
||||||
|
@@ -0,0 +1,45 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Chill\ActivityBundle\Notification;
|
||||||
|
|
||||||
|
use Chill\ActivityBundle\Entity\Activity;
|
||||||
|
use Chill\ActivityBundle\Repository\ActivityRepository;
|
||||||
|
use Chill\MainBundle\Entity\Notification;
|
||||||
|
use Chill\MainBundle\Notification\NotificationHandlerInterface;
|
||||||
|
|
||||||
|
final class ActivityNotificationHandler implements NotificationHandlerInterface
|
||||||
|
{
|
||||||
|
private ActivityRepository $activityRepository;
|
||||||
|
|
||||||
|
public function __construct(ActivityRepository $activityRepository)
|
||||||
|
{
|
||||||
|
$this->activityRepository = $activityRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTemplate(Notification $notification, array $options = []): string
|
||||||
|
{
|
||||||
|
return '@ChillActivity/Activity/showInNotification.html.twig';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTemplateData(Notification $notification, array $options = []): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'notification' => $notification,
|
||||||
|
'activity' => $this->activityRepository->find($notification->getRelatedEntityId()),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function supports(Notification $notification, array $options = []): bool
|
||||||
|
{
|
||||||
|
return $notification->getRelatedEntityClass() === Activity::class;
|
||||||
|
}
|
||||||
|
}
|
@@ -1,33 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Chill is a software for social workers
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view
|
|
||||||
* the LICENSE file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace Chill\ActivityBundle\Notification;
|
|
||||||
|
|
||||||
use Chill\ActivityBundle\Entity\Activity;
|
|
||||||
use Chill\MainBundle\Entity\Notification;
|
|
||||||
|
|
||||||
final class ActivityNotificationRenderer
|
|
||||||
{
|
|
||||||
public function getTemplate()
|
|
||||||
{
|
|
||||||
return '@ChillActivity/Activity/showInNotification.html.twig';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getTemplateData(Notification $notification)
|
|
||||||
{
|
|
||||||
return ['notification' => $notification];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function supports(Notification $notification, array $options = []): bool
|
|
||||||
{
|
|
||||||
return $notification->getRelatedEntityClass() === Activity::class;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -22,6 +22,7 @@ use Doctrine\ORM\EntityManagerInterface;
|
|||||||
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
|
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
|
||||||
use Symfony\Component\Security\Core\Role\Role;
|
use Symfony\Component\Security\Core\Role\Role;
|
||||||
use Symfony\Component\Security\Core\Security;
|
use Symfony\Component\Security\Core\Security;
|
||||||
|
|
||||||
use function count;
|
use function count;
|
||||||
use function in_array;
|
use function in_array;
|
||||||
|
|
||||||
@@ -167,7 +168,9 @@ final class ActivityACLAwareRepository implements ActivityACLAwareRepositoryInte
|
|||||||
$reachableScopes = $this->authorizationHelper->getReachableScopes($this->tokenStorage->getToken()->getUser(), $role, $center);
|
$reachableScopes = $this->authorizationHelper->getReachableScopes($this->tokenStorage->getToken()->getUser(), $role, $center);
|
||||||
// we get the ids for those scopes
|
// we get the ids for those scopes
|
||||||
$reachablesScopesId = array_map(
|
$reachablesScopesId = array_map(
|
||||||
static function (Scope $scope) { return $scope->getId(); },
|
static function (Scope $scope) {
|
||||||
|
return $scope->getId();
|
||||||
|
},
|
||||||
$reachableScopes
|
$reachableScopes
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@@ -31,6 +31,8 @@ class ActivityRepository extends ServiceEntityRepository
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @deprecated use @see{ActivityACLAwareRepositoryInterface::findByAccompanyingPeriod}
|
||||||
|
*
|
||||||
* @return Activity[]
|
* @return Activity[]
|
||||||
*/
|
*/
|
||||||
public function findByAccompanyingPeriod(AccompanyingPeriod $period, array $scopes, ?bool $allowNullScope = false, ?int $limit = 100, ?int $offset = 0, array $orderBy = ['date' => 'desc']): array
|
public function findByAccompanyingPeriod(AccompanyingPeriod $period, array $scopes, ?bool $allowNullScope = false, ?int $limit = 100, ?int $offset = 0, array $orderBy = ['date' => 'desc']): array
|
||||||
|
@@ -9,8 +9,9 @@ div.new-activity-select-type {
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
justify-content: center;
|
justify-content: flex-start;
|
||||||
gap: 12px;
|
gap: 12px;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
|
||||||
div.bloc {
|
div.bloc {
|
||||||
width: 200px;
|
width: 200px;
|
||||||
@@ -24,30 +25,31 @@ div.new-activity-select-type {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//// ACTIVITY LIST PAGE
|
//// ACTIVITY LIST PAGE
|
||||||
// precise badge-title specific details
|
// precise dashboard specific details
|
||||||
|
|
||||||
h2.badge-title {
|
p.date-label {
|
||||||
div.duration {
|
display: inline-block;
|
||||||
font-size: smaller;
|
margin: 0 0.5em 0 0;
|
||||||
padding-left: 1em;
|
font-weight: 700;
|
||||||
margin-top: 1em;
|
font-size: 18pt;
|
||||||
}
|
|
||||||
ul.list-content {
|
|
||||||
font-size: 70%;
|
|
||||||
list-style-type: none;
|
|
||||||
padding-left: 0;
|
|
||||||
margin: 0;
|
|
||||||
li {
|
|
||||||
margin-bottom: 0.2em;
|
|
||||||
// exception: change bg color for action badges above badge-title
|
|
||||||
.bg-light {
|
|
||||||
background-color: $chill-light-gray !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
div.main {
|
div.dashboard,
|
||||||
padding: 1em;
|
h4.badge-title,
|
||||||
|
h3.badge-title,
|
||||||
|
h2.badge-title {
|
||||||
|
ul.list-content {
|
||||||
|
font-size: 70%;
|
||||||
|
list-style-type: none;
|
||||||
|
padding-left: 0;
|
||||||
|
margin: 0;
|
||||||
|
li {
|
||||||
|
margin-bottom: 0.2em;
|
||||||
|
// exception: change bg color for action badges above dashboard
|
||||||
|
.bg-light {
|
||||||
|
background-color: $chill-light-gray !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//// ACTIVITY SHOW AND FORM PAGES
|
//// ACTIVITY SHOW AND FORM PAGES
|
||||||
|
@@ -11,7 +11,7 @@ import Location from './components/Location.vue';
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "App",
|
name: "App",
|
||||||
props: ['hasSocialIssues', 'hasLocation', 'hasPerson'],
|
props: ['hasSocialIssues', 'hasLocation', 'hasPerson'],
|
||||||
components: {
|
components: {
|
||||||
ConcernedGroups,
|
ConcernedGroups,
|
||||||
SocialIssuesAcc,
|
SocialIssuesAcc,
|
||||||
|
@@ -17,6 +17,14 @@ const getLocations = () => fetchResults('/api/1.0/main/location.json');
|
|||||||
|
|
||||||
const getLocationTypes = () => fetchResults('/api/1.0/main/location-type.json');
|
const getLocationTypes = () => fetchResults('/api/1.0/main/location-type.json');
|
||||||
|
|
||||||
|
const getUserCurrentLocation =
|
||||||
|
() => fetch('/api/1.0/main/user-current-location.json')
|
||||||
|
.then(response => {
|
||||||
|
if (response.ok) { return response.json(); }
|
||||||
|
throw Error('Error with request resource response');
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Load Location Type by defaultFor
|
* Load Location Type by defaultFor
|
||||||
* @param {string} entity - can be "person" or "thirdparty"
|
* @param {string} entity - can be "person" or "thirdparty"
|
||||||
@@ -48,5 +56,6 @@ export {
|
|||||||
getLocations,
|
getLocations,
|
||||||
getLocationTypes,
|
getLocationTypes,
|
||||||
getLocationTypeByDefaultFor,
|
getLocationTypeByDefaultFor,
|
||||||
postLocation
|
postLocation,
|
||||||
|
getUserCurrentLocation
|
||||||
};
|
};
|
||||||
|
@@ -1,45 +1,52 @@
|
|||||||
<template>
|
<template>
|
||||||
<teleport to="#add-persons" v-if="isComponentVisible">
|
<teleport to="#add-persons" v-if="isComponentVisible">
|
||||||
|
|
||||||
<div class="flex-bloc concerned-groups" :class="getContext">
|
<div class="flex-bloc concerned-groups" :class="getContext">
|
||||||
<persons-bloc
|
<persons-bloc
|
||||||
v-for="bloc in contextPersonsBlocs"
|
v-for="bloc in contextPersonsBlocs"
|
||||||
v-bind:key="bloc.key"
|
v-bind:key="bloc.key"
|
||||||
v-bind:bloc="bloc"
|
v-bind:bloc="bloc"
|
||||||
v-bind:blocWidth="getBlocWidth"
|
v-bind:blocWidth="getBlocWidth"
|
||||||
v-bind:setPersonsInBloc="setPersonsInBloc">
|
v-bind:setPersonsInBloc="setPersonsInBloc">
|
||||||
</persons-bloc>
|
</persons-bloc>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="getContext === 'accompanyingCourse' && suggestedEntities.length > 0">
|
<div v-if="getContext === 'accompanyingCourse' && suggestedEntities.length > 0">
|
||||||
<ul class="list-suggest add-items">
|
<ul class="list-suggest add-items inline">
|
||||||
<li v-for="p in suggestedEntities" @click="addSuggestedEntity(p)">
|
<li v-for="(p, i) in suggestedEntities" @click="addSuggestedEntity(p)" :key="`suggestedEntities-${i}`">
|
||||||
<span>{{ p.text }}</span>
|
<person-text v-if="p.type === 'person'" :person="p"></person-text>
|
||||||
</li>
|
<span v-else>{{ p.text }}</span>
|
||||||
</ul>
|
</li>
|
||||||
</div>
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
<add-persons
|
<ul class="record_actions">
|
||||||
buttonTitle="activity.add_persons"
|
<li class="add-persons">
|
||||||
modalTitle="activity.add_persons"
|
<add-persons
|
||||||
v-bind:key="addPersons.key"
|
buttonTitle="activity.add_persons"
|
||||||
v-bind:options="addPersonsOptions"
|
modalTitle="activity.add_persons"
|
||||||
@addNewPersons="addNewPersons"
|
v-bind:key="addPersons.key"
|
||||||
ref="addPersons">
|
v-bind:options="addPersonsOptions"
|
||||||
</add-persons>
|
@addNewPersons="addNewPersons"
|
||||||
|
ref="addPersons">
|
||||||
|
</add-persons>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
</teleport>
|
</teleport>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapState, mapGetters } from 'vuex';
|
import { mapState, mapGetters } from 'vuex';
|
||||||
import AddPersons from 'ChillPersonAssets/vuejs/_components/AddPersons.vue';
|
import AddPersons from 'ChillPersonAssets/vuejs/_components/AddPersons.vue';
|
||||||
import PersonsBloc from './ConcernedGroups/PersonsBloc.vue';
|
import PersonsBloc from './ConcernedGroups/PersonsBloc.vue';
|
||||||
|
import PersonText from 'ChillPersonAssets/vuejs/_components/Entity/PersonText.vue';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "ConcernedGroups",
|
name: "ConcernedGroups",
|
||||||
components: {
|
components: {
|
||||||
AddPersons,
|
AddPersons,
|
||||||
PersonsBloc
|
PersonsBloc,
|
||||||
|
PersonText
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
@@ -1,22 +1,29 @@
|
|||||||
<template>
|
<template>
|
||||||
<li>
|
<li>
|
||||||
<span :title="person.text">
|
<span :title="person.text">
|
||||||
<span class="chill_denomination">{{ textCutted }}</span>
|
<span class="chill_denomination" @click.prevent="$emit('remove', person)">
|
||||||
<a @click.prevent="$emit('remove', person)"></a>
|
<person-text :person="person" :isCut="true"></person-text>
|
||||||
|
</span>
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import PersonText from 'ChillPersonAssets/vuejs/_components/Entity/PersonText.vue';
|
||||||
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "PersonBadge",
|
name: "PersonBadge",
|
||||||
props: ['person'],
|
props: ['person'],
|
||||||
computed: {
|
components: {
|
||||||
textCutted() {
|
PersonText
|
||||||
let more = (this.person.text.length > 15) ?'…' : '';
|
|
||||||
return this.person.text.slice(0,15) + more;
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
// computed: {
|
||||||
|
// textCutted() {
|
||||||
|
// let more = (this.person.text.length > 15) ?'…' : '';
|
||||||
|
// return this.person.text.slice(0,15) + more;
|
||||||
|
// }
|
||||||
|
// },
|
||||||
emits: ['remove'],
|
emits: ['remove'],
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@@ -15,14 +15,16 @@
|
|||||||
:searchable="true"
|
:searchable="true"
|
||||||
:placeholder="$t('activity.choose_location')"
|
:placeholder="$t('activity.choose_location')"
|
||||||
:custom-label="customLabel"
|
:custom-label="customLabel"
|
||||||
:options="locations"
|
:select-label="$t('multiselect.select_label')"
|
||||||
|
:deselect-label="$t('multiselect.deselect_label')"
|
||||||
|
:selected-label="$t('multiselect.selected_label')"
|
||||||
|
:options="availableLocations"
|
||||||
group-values="locations"
|
group-values="locations"
|
||||||
group-label="locationGroup"
|
group-label="locationGroup"
|
||||||
v-model="location"
|
v-model="location"
|
||||||
>
|
>
|
||||||
</VueMultiselect>
|
</VueMultiselect>
|
||||||
|
<new-location v-bind:availableLocations="availableLocations"></new-location>
|
||||||
<new-location v-bind:locations="locations"></new-location>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</teleport>
|
</teleport>
|
||||||
@@ -32,7 +34,6 @@
|
|||||||
import { mapState, mapGetters } from "vuex";
|
import { mapState, mapGetters } from "vuex";
|
||||||
import VueMultiselect from "vue-multiselect";
|
import VueMultiselect from "vue-multiselect";
|
||||||
import NewLocation from "./Location/NewLocation.vue";
|
import NewLocation from "./Location/NewLocation.vue";
|
||||||
import { getLocations, getLocationTypeByDefaultFor } from "../api.js";
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "Location",
|
name: "Location",
|
||||||
@@ -40,13 +41,8 @@ export default {
|
|||||||
NewLocation,
|
NewLocation,
|
||||||
VueMultiselect,
|
VueMultiselect,
|
||||||
},
|
},
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
locations: [],
|
|
||||||
};
|
|
||||||
},
|
|
||||||
computed: {
|
computed: {
|
||||||
...mapState(["activity"]),
|
...mapState(["activity", "availableLocations"]),
|
||||||
...mapGetters(["suggestedEntities"]),
|
...mapGetters(["suggestedEntities"]),
|
||||||
location: {
|
location: {
|
||||||
get() {
|
get() {
|
||||||
@@ -57,53 +53,6 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
mounted() {
|
|
||||||
getLocations().then(
|
|
||||||
(results) => {
|
|
||||||
getLocationTypeByDefaultFor('person').then(
|
|
||||||
(personLocationType) => {
|
|
||||||
if (personLocationType) {
|
|
||||||
const personLocation = this.makeAccompanyingPeriodLocation(personLocationType);
|
|
||||||
const concernedPersonsLocation =
|
|
||||||
this.makeConcernedPersonsLocation(personLocationType);
|
|
||||||
getLocationTypeByDefaultFor('thirdparty').then(
|
|
||||||
thirdpartyLocationType => {
|
|
||||||
const concernedThirdPartiesLocation =
|
|
||||||
this.makeConcernedThirdPartiesLocation(thirdpartyLocationType);
|
|
||||||
this.locations = [
|
|
||||||
{
|
|
||||||
locationGroup: 'Localisation du parcours',
|
|
||||||
locations: [personLocation]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
locationGroup: 'Parties concernées',
|
|
||||||
locations: [...concernedPersonsLocation, ...concernedThirdPartiesLocation]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
locationGroup: 'Autres localisations',
|
|
||||||
locations: results
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
this.locations = [
|
|
||||||
{
|
|
||||||
locationGroup: 'Localisations',
|
|
||||||
locations: response.results
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
if (window.default_location_id) {
|
|
||||||
let location = this.locations.filter(
|
|
||||||
(l) => l.id === window.default_location_id
|
|
||||||
);
|
|
||||||
this.$store.dispatch("updateLocation", location);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
})
|
|
||||||
},
|
|
||||||
methods: {
|
methods: {
|
||||||
labelAccompanyingCourseLocation(value) {
|
labelAccompanyingCourseLocation(value) {
|
||||||
return `${value.address.text} (${value.locationType.title.fr})`
|
return `${value.address.text} (${value.locationType.title.fr})`
|
||||||
@@ -117,58 +66,6 @@ export default {
|
|||||||
: value.locationType.title.fr
|
: value.locationType.title.fr
|
||||||
: '';
|
: '';
|
||||||
},
|
},
|
||||||
makeConcernedPersonsLocation(locationType) {
|
|
||||||
let locations = [];
|
|
||||||
this.suggestedEntities.forEach(
|
|
||||||
(e) => {
|
|
||||||
if (e.type === 'person' && e.current_household_address !== null){
|
|
||||||
locations.push({
|
|
||||||
type: 'location',
|
|
||||||
id: -this.suggestedEntities.indexOf(e)*10,
|
|
||||||
onthefly: true,
|
|
||||||
name: e.text,
|
|
||||||
address: {
|
|
||||||
id: e.current_household_address.address_id,
|
|
||||||
},
|
|
||||||
locationType: locationType
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
return locations;
|
|
||||||
},
|
|
||||||
makeConcernedThirdPartiesLocation(locationType) {
|
|
||||||
let locations = [];
|
|
||||||
this.suggestedEntities.forEach(
|
|
||||||
(e) => {
|
|
||||||
if (e.type === 'thirdparty' && e.address !== null){
|
|
||||||
locations.push({
|
|
||||||
type: 'location',
|
|
||||||
id: -this.suggestedEntities.indexOf(e)*10,
|
|
||||||
onthefly: true,
|
|
||||||
name: e.text,
|
|
||||||
address: { id: e.address.address_id },
|
|
||||||
locationType: locationType
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
return locations;
|
|
||||||
},
|
|
||||||
makeAccompanyingPeriodLocation(locationType) {
|
|
||||||
const accPeriodLocation = this.activity.accompanyingPeriod.location;
|
|
||||||
return {
|
|
||||||
type: 'location',
|
|
||||||
id: -1,
|
|
||||||
onthefly: true,
|
|
||||||
name: '__AccompanyingCourseLocation__',
|
|
||||||
address: {
|
|
||||||
id: accPeriodLocation.address_id,
|
|
||||||
text: `${accPeriodLocation.text} - ${accPeriodLocation.postcode.code} ${accPeriodLocation.postcode.name}`
|
|
||||||
},
|
|
||||||
locationType: locationType
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
@@ -18,15 +18,6 @@
|
|||||||
</template>
|
</template>
|
||||||
<template v-slot:body>
|
<template v-slot:body>
|
||||||
<form>
|
<form>
|
||||||
<div class="form-floating mb-3">
|
|
||||||
<p v-if="errors.length">
|
|
||||||
<b>{{ $t('activity.errors') }}</b>
|
|
||||||
<ul>
|
|
||||||
<li v-for="error in errors" :key="error">{{ error }}</li>
|
|
||||||
</ul>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-floating mb-3">
|
<div class="form-floating mb-3">
|
||||||
<select class="form-select form-select-lg" id="type" required v-model="selectType">
|
<select class="form-select form-select-lg" id="type" required v-model="selectType">
|
||||||
<option selected disabled value="">{{ $t('activity.choose_location_type') }}</option>
|
<option selected disabled value="">{{ $t('activity.choose_location_type') }}</option>
|
||||||
@@ -62,6 +53,12 @@
|
|||||||
<input class="form-control form-control-lg" id="email" v-model="inputEmail" placeholder />
|
<input class="form-control form-control-lg" id="email" v-model="inputEmail" placeholder />
|
||||||
<label for="email">{{ $t('activity.location_fields.email') }}</label>
|
<label for="email">{{ $t('activity.location_fields.email') }}</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="alert alert-warning" v-if="errors.length">
|
||||||
|
<ul>
|
||||||
|
<li v-for="(e, i) in errors" :key="i">{{ e }}</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</template>
|
</template>
|
||||||
<template v-slot:footer>
|
<template v-slot:footer>
|
||||||
@@ -81,7 +78,8 @@
|
|||||||
import Modal from 'ChillMainAssets/vuejs/_components/Modal.vue';
|
import Modal from 'ChillMainAssets/vuejs/_components/Modal.vue';
|
||||||
import AddAddress from "ChillMainAssets/vuejs/Address/components/AddAddress.vue";
|
import AddAddress from "ChillMainAssets/vuejs/Address/components/AddAddress.vue";
|
||||||
import { mapState } from "vuex";
|
import { mapState } from "vuex";
|
||||||
import { getLocationTypes, postLocation } from "../../api";
|
import { getLocationTypes } from "../../api";
|
||||||
|
import { makeFetch } from 'ChillMainAssets/lib/api/apiMethods';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "NewLocation",
|
name: "NewLocation",
|
||||||
@@ -89,7 +87,7 @@ export default {
|
|||||||
Modal,
|
Modal,
|
||||||
AddAddress,
|
AddAddress,
|
||||||
},
|
},
|
||||||
props: ['locations'],
|
props: ['availableLocations'],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
errors: [],
|
errors: [],
|
||||||
@@ -223,7 +221,6 @@ export default {
|
|||||||
},
|
},
|
||||||
saveNewLocation() {
|
saveNewLocation() {
|
||||||
if (this.checkForm()) {
|
if (this.checkForm()) {
|
||||||
console.log('saveNewLocation', this.selected);
|
|
||||||
let body = {
|
let body = {
|
||||||
type: 'location',
|
type: 'location',
|
||||||
name: this.selected.name,
|
name: this.selected.name,
|
||||||
@@ -242,23 +239,28 @@ export default {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
postLocation(body)
|
|
||||||
.then(
|
makeFetch('POST', '/api/1.0/main/location.json', body)
|
||||||
location => new Promise(resolve => {
|
.then(response => {
|
||||||
this.locations.push(location);
|
this.$store.dispatch('addAvailableLocationGroup', {
|
||||||
this.$store.dispatch('updateLocation', location);
|
locationGroup: 'Localisations nouvellement créées',
|
||||||
resolve();
|
locations: [response]
|
||||||
this.modal.showModal = false;
|
});
|
||||||
})
|
this.$store.dispatch('updateLocation', response);
|
||||||
).catch(
|
this.modal.showModal = false;
|
||||||
err => {
|
})
|
||||||
this.errors.push(err.message);
|
.catch((error) => {
|
||||||
|
if (error.name === 'ValidationException') {
|
||||||
|
for (let v of error.violations) {
|
||||||
|
this.errors.push(v);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.errors.push('An error occurred');
|
||||||
}
|
}
|
||||||
);
|
})
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
submitNewAddress(payload) {
|
submitNewAddress(payload) {
|
||||||
console.log('submitNewAddress', payload);
|
|
||||||
this.selected.addressId = payload.addressId;
|
this.selected.addressId = payload.addressId;
|
||||||
this.addAddress.context.addressId = payload.addressId;
|
this.addAddress.context.addressId = payload.addressId;
|
||||||
this.addAddress.context.edit = true;
|
this.addAddress.context.edit = true;
|
||||||
|
@@ -9,9 +9,9 @@
|
|||||||
|
|
||||||
<check-social-issue
|
<check-social-issue
|
||||||
v-for="issue in socialIssuesList"
|
v-for="issue in socialIssuesList"
|
||||||
v-bind:key="issue.id"
|
:key="issue.id"
|
||||||
v-bind:issue="issue"
|
:issue="issue"
|
||||||
v-bind:selection="socialIssuesSelected"
|
:selection="socialIssuesSelected"
|
||||||
@updateSelected="updateIssuesSelected">
|
@updateSelected="updateIssuesSelected">
|
||||||
</check-social-issue>
|
</check-social-issue>
|
||||||
|
|
||||||
@@ -21,18 +21,18 @@
|
|||||||
label="text"
|
label="text"
|
||||||
track-by="id"
|
track-by="id"
|
||||||
open-direction="bottom"
|
open-direction="bottom"
|
||||||
v-bind:close-on-select="true"
|
:close-on-select="true"
|
||||||
v-bind:preserve-search="false"
|
:preserve-search="false"
|
||||||
v-bind:reset-after="true"
|
:reset-after="true"
|
||||||
v-bind:hide-selected="true"
|
:hide-selected="true"
|
||||||
v-bind:taggable="false"
|
:taggable="false"
|
||||||
v-bind:multiple="false"
|
:multiple="false"
|
||||||
v-bind:searchable="true"
|
:searchable="true"
|
||||||
v-bind:allow-empty="true"
|
:allow-empty="true"
|
||||||
v-bind:show-labels="false"
|
:show-labels="false"
|
||||||
v-bind:loading="issueIsLoading"
|
:loading="issueIsLoading"
|
||||||
v-bind:placeholder="$t('activity.choose_other_social_issue')"
|
:placeholder="$t('activity.choose_other_social_issue')"
|
||||||
v-bind:options="socialIssuesOther"
|
:options="socialIssuesOther"
|
||||||
@select="addIssueInList">
|
@select="addIssueInList">
|
||||||
</VueMultiselect>
|
</VueMultiselect>
|
||||||
</div>
|
</div>
|
||||||
@@ -58,9 +58,9 @@
|
|||||||
<check-social-action
|
<check-social-action
|
||||||
v-if="socialIssuesSelected.length || socialActionsSelected.length"
|
v-if="socialIssuesSelected.length || socialActionsSelected.length"
|
||||||
v-for="action in socialActionsList"
|
v-for="action in socialActionsList"
|
||||||
v-bind:key="action.id"
|
:key="action.id"
|
||||||
v-bind:action="action"
|
:action="action"
|
||||||
v-bind:selection="socialActionsSelected"
|
:selection="socialActionsSelected"
|
||||||
@updateSelected="updateActionsSelected">
|
@updateSelected="updateActionsSelected">
|
||||||
</check-social-action>
|
</check-social-action>
|
||||||
</template>
|
</template>
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
import { personMessages } from 'ChillPersonAssets/vuejs/_js/i18n'
|
import { personMessages } from 'ChillPersonAssets/vuejs/_js/i18n'
|
||||||
|
import { multiSelectMessages } from 'ChillMainAssets/vuejs/_js/i18n'
|
||||||
|
|
||||||
const activityMessages = {
|
const activityMessages = {
|
||||||
fr: {
|
fr: {
|
||||||
@@ -33,12 +34,11 @@ const activityMessages = {
|
|||||||
},
|
},
|
||||||
create_address: 'Créer une adresse',
|
create_address: 'Créer une adresse',
|
||||||
edit_address: "Modifier l'adresse"
|
edit_address: "Modifier l'adresse"
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Object.assign(activityMessages.fr, personMessages.fr);
|
Object.assign(activityMessages.fr, personMessages.fr, multiSelectMessages.fr);
|
||||||
|
|
||||||
export {
|
export {
|
||||||
activityMessages
|
activityMessages
|
||||||
|
@@ -2,17 +2,25 @@ import { createApp } from 'vue';
|
|||||||
import { _createI18n } from 'ChillMainAssets/vuejs/_js/i18n'
|
import { _createI18n } from 'ChillMainAssets/vuejs/_js/i18n'
|
||||||
import { activityMessages } from './i18n'
|
import { activityMessages } from './i18n'
|
||||||
import store from './store'
|
import store from './store'
|
||||||
|
import PickTemplate from 'ChillDocGeneratorAssets/vuejs/_components/PickTemplate.vue';
|
||||||
|
import {fetchTemplates} from 'ChillDocGeneratorAssets/api/pickTemplate.js';
|
||||||
|
|
||||||
import App from './App.vue';
|
import App from './App.vue';
|
||||||
|
|
||||||
const i18n = _createI18n(activityMessages);
|
const i18n = _createI18n(activityMessages);
|
||||||
|
|
||||||
|
// app for activity
|
||||||
|
|
||||||
const hasSocialIssues = document.querySelector('#social-issues-acc') !== null;
|
const hasSocialIssues = document.querySelector('#social-issues-acc') !== null;
|
||||||
const hasLocation = document.querySelector('#location') !== null;
|
const hasLocation = document.querySelector('#location') !== null;
|
||||||
const hasPerson = document.querySelector('#add-persons') !== null;
|
const hasPerson = document.querySelector('#add-persons') !== null;
|
||||||
|
|
||||||
const app = createApp({
|
const app = createApp({
|
||||||
template: `<app :hasSocialIssues="hasSocialIssues", :hasLocation="hasLocation", :hasPerson="hasPerson"></app>`,
|
template: `<app
|
||||||
|
:hasSocialIssues="hasSocialIssues"
|
||||||
|
:hasLocation="hasLocation"
|
||||||
|
:hasPerson="hasPerson"
|
||||||
|
></app>`,
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
hasSocialIssues,
|
hasSocialIssues,
|
||||||
@@ -25,3 +33,54 @@ const app = createApp({
|
|||||||
.use(i18n)
|
.use(i18n)
|
||||||
.component('app', App)
|
.component('app', App)
|
||||||
.mount('#activity');
|
.mount('#activity');
|
||||||
|
|
||||||
|
|
||||||
|
// app for picking template
|
||||||
|
|
||||||
|
const i18nGendoc = _createI18n({});
|
||||||
|
|
||||||
|
document.querySelectorAll('div[data-docgen-template-picker]').forEach(el => {
|
||||||
|
fetchTemplates(el.dataset.entityClass).then(templates => {
|
||||||
|
const picker = {
|
||||||
|
template:
|
||||||
|
'<pick-template :templates="this.templates" :preventDefaultMoveToGenerate="true" ' +
|
||||||
|
':entityClass="faked" @go-to-generate-document="generateDoc"></pick-template>',
|
||||||
|
components: {
|
||||||
|
PickTemplate,
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
templates: templates,
|
||||||
|
entityId: el.dataset.entityId,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
generateDoc({event, link, template}) {
|
||||||
|
console.log('generateDoc');
|
||||||
|
console.log('link', link);
|
||||||
|
console.log('template', template);
|
||||||
|
|
||||||
|
let hiddenInput = document.querySelector("input[data-template-id]");
|
||||||
|
|
||||||
|
if (hiddenInput === null) {
|
||||||
|
console.error('hidden input not found');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
hiddenInput.value = template;
|
||||||
|
|
||||||
|
let form = document.querySelector('form[name="chill_activitybundle_activity"');
|
||||||
|
|
||||||
|
if (form === null) {
|
||||||
|
console.error('form not found');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
form.submit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
createApp(picker).use(i18nGendoc).mount(el);
|
||||||
|
})
|
||||||
|
|
||||||
|
});
|
||||||
|
@@ -1,22 +1,23 @@
|
|||||||
import 'es6-promise/auto';
|
import 'es6-promise/auto';
|
||||||
import { createStore } from 'vuex';
|
import { createStore } from 'vuex';
|
||||||
import { postLocation } from './api';
|
import { postLocation } from './api';
|
||||||
|
import prepareLocations from './store.locations.js';
|
||||||
|
|
||||||
const debug = process.env.NODE_ENV !== 'production';
|
const debug = process.env.NODE_ENV !== 'production';
|
||||||
//console.log('window.activity', window.activity);
|
//console.log('window.activity', window.activity);
|
||||||
|
|
||||||
const addIdToValue = (string, id) => {
|
const addIdToValue = (string, id) => {
|
||||||
let array = string ? string.split(',') : [];
|
let array = string ? string.split(',') : [];
|
||||||
array.push(id.toString());
|
array.push(id.toString());
|
||||||
let str = array.join();
|
let str = array.join();
|
||||||
return str;
|
return str;
|
||||||
};
|
};
|
||||||
|
|
||||||
const removeIdFromValue = (string, id) => {
|
const removeIdFromValue = (string, id) => {
|
||||||
let array = string.split(',');
|
let array = string.split(',');
|
||||||
array = array.filter(el => el !== id.toString());
|
array = array.filter(el => el !== id.toString());
|
||||||
let str = array.join();
|
let str = array.join();
|
||||||
return str;
|
return str;
|
||||||
};
|
};
|
||||||
|
|
||||||
const store = createStore({
|
const store = createStore({
|
||||||
@@ -25,6 +26,7 @@ const store = createStore({
|
|||||||
activity: window.activity,
|
activity: window.activity,
|
||||||
socialIssuesOther: [],
|
socialIssuesOther: [],
|
||||||
socialActionsList: [],
|
socialActionsList: [],
|
||||||
|
availableLocations: [],
|
||||||
},
|
},
|
||||||
getters: {
|
getters: {
|
||||||
suggestedEntities(state) {
|
suggestedEntities(state) {
|
||||||
@@ -50,9 +52,9 @@ const store = createStore({
|
|||||||
return state.activity.activityType.personsVisible === 0
|
return state.activity.activityType.personsVisible === 0
|
||||||
? []
|
? []
|
||||||
: state.activity.accompanyingPeriod.participations
|
: state.activity.accompanyingPeriod.participations
|
||||||
.filter((p) => p.endDate === null)
|
.filter((p) => p.endDate === null)
|
||||||
.map((p) => p.person)
|
.map((p) => p.person)
|
||||||
.filter((p) => !existingPersonIds.includes(p.id));
|
.filter((p) => !existingPersonIds.includes(p.id));
|
||||||
},
|
},
|
||||||
suggestedRequestor(state) {
|
suggestedRequestor(state) {
|
||||||
if (state.activity.accompanyingPeriod.requestor === null) {
|
if (state.activity.accompanyingPeriod.requestor === null) {
|
||||||
@@ -78,8 +80,8 @@ const store = createStore({
|
|||||||
return state.activity.activityType.usersVisible === 0
|
return state.activity.activityType.usersVisible === 0
|
||||||
? []
|
? []
|
||||||
: [state.activity.accompanyingPeriod.user].filter(
|
: [state.activity.accompanyingPeriod.user].filter(
|
||||||
(u) => u !== null && !existingUserIds.includes(u.id)
|
(u) => u !== null && !existingUserIds.includes(u.id)
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
suggestedResources(state) {
|
suggestedResources(state) {
|
||||||
const resources = state.activity.accompanyingPeriod.resources;
|
const resources = state.activity.accompanyingPeriod.resources;
|
||||||
@@ -200,6 +202,9 @@ const store = createStore({
|
|||||||
console.log("### mutation: updateLocation", value);
|
console.log("### mutation: updateLocation", value);
|
||||||
state.activity.location = value;
|
state.activity.location = value;
|
||||||
},
|
},
|
||||||
|
addAvailableLocationGroup(state, group) {
|
||||||
|
state.availableLocations.push(group);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
actions: {
|
actions: {
|
||||||
addIssueSelected({ commit }, issue) {
|
addIssueSelected({ commit }, issue) {
|
||||||
@@ -235,6 +240,9 @@ const store = createStore({
|
|||||||
});
|
});
|
||||||
commit("updateActionsSelected", payload);
|
commit("updateActionsSelected", payload);
|
||||||
},
|
},
|
||||||
|
addAvailableLocationGroup({ commit }, payload) {
|
||||||
|
commit("addAvailableLocationGroup", payload);
|
||||||
|
},
|
||||||
addPersonsInvolved({ commit }, payload) {
|
addPersonsInvolved({ commit }, payload) {
|
||||||
//console.log('### action addPersonsInvolved', payload.result.type);
|
//console.log('### action addPersonsInvolved', payload.result.type);
|
||||||
switch (payload.result.type) {
|
switch (payload.result.type) {
|
||||||
@@ -335,4 +343,6 @@ const store = createStore({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
prepareLocations(store);
|
||||||
|
|
||||||
export default store;
|
export default store;
|
||||||
|
@@ -0,0 +1,123 @@
|
|||||||
|
import {getLocations, getLocationTypeByDefaultFor, getUserCurrentLocation} from "./api";
|
||||||
|
|
||||||
|
const makeConcernedPersonsLocation = (locationType, store) => {
|
||||||
|
let locations = [];
|
||||||
|
store.getters.suggestedEntities.forEach(
|
||||||
|
(e) => {
|
||||||
|
if (e.type === 'person' && e.current_household_address !== null){
|
||||||
|
locations.push({
|
||||||
|
type: 'location',
|
||||||
|
id: -store.getters.suggestedEntities.indexOf(e)*10,
|
||||||
|
onthefly: true,
|
||||||
|
name: e.text,
|
||||||
|
address: {
|
||||||
|
id: e.current_household_address.address_id,
|
||||||
|
},
|
||||||
|
locationType: locationType
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
return locations;
|
||||||
|
};
|
||||||
|
const makeConcernedThirdPartiesLocation = (locationType, store) => {
|
||||||
|
let locations = [];
|
||||||
|
store.getters.suggestedEntities.forEach(
|
||||||
|
(e) => {
|
||||||
|
if (e.type === 'thirdparty' && e.address !== null){
|
||||||
|
locations.push({
|
||||||
|
type: 'location',
|
||||||
|
id: -store.getters.suggestedEntities.indexOf(e)*10,
|
||||||
|
onthefly: true,
|
||||||
|
name: e.text,
|
||||||
|
address: { id: e.address.address_id },
|
||||||
|
locationType: locationType
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
return locations;
|
||||||
|
};
|
||||||
|
const makeAccompanyingPeriodLocation = (locationType, store) => {
|
||||||
|
const accPeriodLocation = store.state.activity.accompanyingPeriod.location;
|
||||||
|
return {
|
||||||
|
type: 'location',
|
||||||
|
id: -1,
|
||||||
|
onthefly: true,
|
||||||
|
name: '__AccompanyingCourseLocation__',
|
||||||
|
address: {
|
||||||
|
id: accPeriodLocation.address_id,
|
||||||
|
text: `${accPeriodLocation.text} - ${accPeriodLocation.postcode.code} ${accPeriodLocation.postcode.name}`
|
||||||
|
},
|
||||||
|
locationType: locationType
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function prepareLocations(store) {
|
||||||
|
|
||||||
|
// find the locations
|
||||||
|
let allLocations = getLocations().then(
|
||||||
|
(results) => {
|
||||||
|
store.commit('addAvailableLocationGroup', {
|
||||||
|
locationGroup: 'Autres localisations',
|
||||||
|
locations: results
|
||||||
|
});
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
let currentLocation = getUserCurrentLocation().then(
|
||||||
|
userCurrentLocation => {
|
||||||
|
if (null !== userCurrentLocation) {
|
||||||
|
store.commit('addAvailableLocationGroup', {
|
||||||
|
locationGroup: 'Ma localisation',
|
||||||
|
locations: [userCurrentLocation]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
let partiesLocations = [], partyPromise;
|
||||||
|
['person', 'thirdparty'].forEach(kind => {
|
||||||
|
partyPromise = getLocationTypeByDefaultFor(kind).then(
|
||||||
|
(kindLocationType) => {
|
||||||
|
if (kindLocationType) {
|
||||||
|
let concernedKindLocations;
|
||||||
|
if (kind === 'person') {
|
||||||
|
concernedKindLocations = makeConcernedPersonsLocation(kindLocationType, store);
|
||||||
|
// add location for the parcours into suggestions
|
||||||
|
const personLocation = makeAccompanyingPeriodLocation(kindLocationType, store);
|
||||||
|
store.commit('addAvailableLocationGroup', {
|
||||||
|
locationGroup: 'Localisation du parcours',
|
||||||
|
locations: [personLocation]
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
concernedKindLocations = makeConcernedThirdPartiesLocation(kindLocationType, store);
|
||||||
|
}
|
||||||
|
|
||||||
|
store.commit('addAvailableLocationGroup', {
|
||||||
|
locationGroup: kind === 'person' ? 'Usagers concernés' : 'Tiers concernés',
|
||||||
|
locations: concernedKindLocations,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
partiesLocations.push(partyPromise);
|
||||||
|
});
|
||||||
|
|
||||||
|
// when all location are loaded
|
||||||
|
Promise.all([allLocations, currentLocation, ...partiesLocations]).then(() => {
|
||||||
|
console.log('current location in activity', store.state.activity.location);
|
||||||
|
console.log('default loation id', window.default_location_id);
|
||||||
|
if (window.default_location_id) {
|
||||||
|
for (let group of store.state.availableLocations) {
|
||||||
|
console.log(group);
|
||||||
|
let location = group.locations.find((l) => l.id === window.default_location_id);
|
||||||
|
console.log(location);
|
||||||
|
if (location !== undefined) {
|
||||||
|
store.dispatch('updateLocation', location);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
@@ -18,7 +18,8 @@ use Symfony\Component\HttpFoundation\Request;
|
|||||||
|
|
||||||
// This check prevents access to debug front controllers that are deployed by accident to production servers.
|
// This check prevents access to debug front controllers that are deployed by accident to production servers.
|
||||||
// Feel free to remove this, extend it, or make something more sophisticated.
|
// Feel free to remove this, extend it, or make something more sophisticated.
|
||||||
if (isset($_SERVER['HTTP_CLIENT_IP'])
|
if (
|
||||||
|
isset($_SERVER['HTTP_CLIENT_IP'])
|
||||||
|| isset($_SERVER['HTTP_X_FORWARDED_FOR'])
|
|| isset($_SERVER['HTTP_X_FORWARDED_FOR'])
|
||||||
|| !(in_array($_SERVER['REMOTE_ADDR'], ['127.0.0.1', 'fe80::1', '::1'], true) || \PHP_SAPI === 'cli-server')
|
|| !(in_array($_SERVER['REMOTE_ADDR'], ['127.0.0.1', 'fe80::1', '::1'], true) || \PHP_SAPI === 'cli-server')
|
||||||
) {
|
) {
|
||||||
|
@@ -0,0 +1,170 @@
|
|||||||
|
{% set t = activity.type %}
|
||||||
|
<div class="item-bloc activity-item{% if itemBlocClass is defined %} {{ itemBlocClass }}{% endif %}">
|
||||||
|
|
||||||
|
<div class="item-row">
|
||||||
|
<div class="wrap-list">
|
||||||
|
<div class="wl-row">
|
||||||
|
<div class="wl-col title">
|
||||||
|
{% if activity.date %}
|
||||||
|
<p class="date-label">
|
||||||
|
{{ activity.date|format_date('short') }}
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<div class="wl-col list">
|
||||||
|
<h2 class="badge-title">
|
||||||
|
<span class="title_label"></span>
|
||||||
|
<span class="title_action">
|
||||||
|
{{ activity.type.name | localize_translatable_string }}
|
||||||
|
|
||||||
|
{% if activity.emergency %}
|
||||||
|
<span class="badge bg-danger rounded-pill fs-6 float-end">{{ 'Emergency'|trans|upper }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</span>
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="item-row column separator">
|
||||||
|
<div class="wrap-list">
|
||||||
|
{% if activity.location and t.locationVisible %}
|
||||||
|
<div class="wl-row">
|
||||||
|
<div class="wl-col title"><h3>{{ 'location'|trans }}</h3></div>
|
||||||
|
<div class="wl-col list">
|
||||||
|
<p class="wl-item">
|
||||||
|
{{ activity.location.name }}
|
||||||
|
<span>({{ activity.location.locationType.title|localize_translatable_string }})</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if activity.attendee and t.attendeeVisible %}
|
||||||
|
<div class="wl-row">
|
||||||
|
<div class="wl-col title"><h3>{{ 'Attendee'|trans }}</h3></div>
|
||||||
|
<div class="wl-col list">
|
||||||
|
<p class="wl-item">
|
||||||
|
{{ activity.attendee.name|localize_translatable_string }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if activity.sentReceived is not empty and t.sentReceivedVisible %}
|
||||||
|
<div class="wl-row">
|
||||||
|
<div class="wl-col title"><h3>{{ 'Sent received'|trans }}</h3></div>
|
||||||
|
<div class="wl-col list">
|
||||||
|
<p class="wl-item">
|
||||||
|
{{ activity.sentReceived|capitalize|trans }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if activity.user and t.userVisible %}
|
||||||
|
<div class="wl-row">
|
||||||
|
<div class="wl-col title"><h3>{{ 'Referrer'|trans }}</h3></div>
|
||||||
|
<div class="wl-col list">
|
||||||
|
<p class="wl-item">
|
||||||
|
{{ activity.user|chill_entity_render_box }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% include 'ChillActivityBundle:Activity:concernedGroups.html.twig' with {
|
||||||
|
'context': context,
|
||||||
|
'render': 'wrap-list',
|
||||||
|
'entity': activity,
|
||||||
|
'badge_person': true
|
||||||
|
} %}
|
||||||
|
|
||||||
|
<div class="wrap-list">
|
||||||
|
{%- if activity.reasons is not empty and t.reasonsVisible -%}
|
||||||
|
<div class="wl-row">
|
||||||
|
<div class="wl-col title">
|
||||||
|
<h3>{{ 'Reasons'|trans }}</h3>
|
||||||
|
</div>
|
||||||
|
<div class="wl-col list">
|
||||||
|
{% for r in activity.reasons %}
|
||||||
|
<p class="wl-item reasons">
|
||||||
|
{{ r|chill_entity_render_box }}
|
||||||
|
</p>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{%- if activity.socialIssues is not empty and t.socialIssuesVisible -%}
|
||||||
|
<div class="wl-row">
|
||||||
|
<div class="wl-col title">
|
||||||
|
<h3>{{ 'Social issues'|trans }}</h3>
|
||||||
|
</div>
|
||||||
|
<div class="wl-col list">
|
||||||
|
{% for r in activity.socialIssues %}
|
||||||
|
<p class="wl-item social-issues">
|
||||||
|
{{ r|chill_entity_render_box }}
|
||||||
|
</p>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{%- if activity.socialActions is not empty and t.socialActionsVisible -%}
|
||||||
|
<div class="wl-row">
|
||||||
|
<div class="wl-col title">
|
||||||
|
<h3>{{ 'Social actions'|trans }}</h3>
|
||||||
|
</div>
|
||||||
|
<div class="wl-col list">
|
||||||
|
{% for r in activity.socialActions %}
|
||||||
|
<p class="wl-item social-actions">
|
||||||
|
{{ r|chill_entity_render_box }}
|
||||||
|
</p>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if activity.comment.comment is not empty and is_granted('CHILL_ACTIVITY_SEE_DETAILS', activity) %}
|
||||||
|
<div class="wl-row">
|
||||||
|
<div class="wl-col title">
|
||||||
|
<h3>{{ 'Comment'|trans }}</h3>
|
||||||
|
</div>
|
||||||
|
<div class="wl-col list">
|
||||||
|
{{ activity.comment|chill_entity_render_box({
|
||||||
|
'disable_markdown': false,
|
||||||
|
'limit_lines': 3,
|
||||||
|
'metadata': false
|
||||||
|
}) }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{# Only if ACL SEE_DETAILS AND/OR only on template SHOW ??
|
||||||
|
durationTime
|
||||||
|
travelTime
|
||||||
|
comment
|
||||||
|
documents
|
||||||
|
attendee
|
||||||
|
#}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="item-row separator">
|
||||||
|
<div class="item-col item-meta">
|
||||||
|
{% set notif_counter = chill_count_notifications('Chill\\ActivityBundle\\Entity\\Activity', activity.id) %}
|
||||||
|
{% if notif_counter.total > 0 %}
|
||||||
|
{{ chill_counter_notifications('Chill\\ActivityBundle\\Entity\\Activity', activity.id) }}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<div class="item-col">
|
||||||
|
<ul class="record_actions">
|
||||||
|
{{ recordAction }}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
@@ -1,110 +0,0 @@
|
|||||||
<h2 class="badge-title">
|
|
||||||
<span class="title_label">
|
|
||||||
|
|
||||||
{% if activity.date %}
|
|
||||||
<h3>{{ activity.date|format_date('short') }}</h3>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<div class="duration">
|
|
||||||
{% if activity.durationTime and t.durationTimeVisible %}
|
|
||||||
<p>
|
|
||||||
<abbr class="fa fa-fw fa-hourglass-end" title="{{ 'Duration Time'|trans }}"></abbr>
|
|
||||||
{{ activity.durationTime|date('H:i') }}
|
|
||||||
</p>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if activity.travelTime and t.travelTimeVisible %}
|
|
||||||
<p>
|
|
||||||
<abbr class="fa fa-fw fa-car" title="{{ 'Travel time'|trans }}"></abbr>
|
|
||||||
{{ activity.travelTime|date('H:i') }}
|
|
||||||
</p>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</span>
|
|
||||||
<span class="title_action">
|
|
||||||
|
|
||||||
{{ activity.type.name | localize_translatable_string }}
|
|
||||||
|
|
||||||
{% if activity.emergency %}
|
|
||||||
<span class="badge bg-danger rounded-pill fs-6">{{ 'Emergency'|trans|upper }}</span>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<ul class="small_in_title mt-3">
|
|
||||||
|
|
||||||
{% if activity.sentReceived is not empty and t.sentReceivedVisible %}
|
|
||||||
<li>
|
|
||||||
<span class="item-key">{{ 'Sent received'|trans ~ ' : ' }}</span>
|
|
||||||
<b>{{ activity.sentReceived|capitalize|trans }}</b>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if activity.location and t.locationVisible %}
|
|
||||||
<li>
|
|
||||||
<span class="item-key">{{ 'location'|trans ~ ': ' }}</span>
|
|
||||||
<b>
|
|
||||||
<span>{{ activity.location.locationType.title|localize_translatable_string }}</span>
|
|
||||||
{{ activity.location.name }}
|
|
||||||
</b>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if activity.user and t.userVisible %}
|
|
||||||
<li>
|
|
||||||
<span class="item-key">{{ 'Referrer'|trans ~ ': ' }}</span>
|
|
||||||
<b>{{ activity.user.usernameCanonical }}</b>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<li class="associated-persons">
|
|
||||||
<span class="item-key">{{ 'Participants'|trans ~ ' : ' }}</span>
|
|
||||||
{% for p in activity.personsAssociated %}
|
|
||||||
<span class="badge-person">{{ p|chill_entity_render_box }}</span>
|
|
||||||
{% endfor %}
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<ul class="list-content my-3">
|
|
||||||
{%- if t.reasonsVisible -%}
|
|
||||||
{%- if activity.reasons is not empty -%}
|
|
||||||
<li class="reasons">
|
|
||||||
{% for r in activity.reasons %}
|
|
||||||
{{ r|chill_entity_render_box }}
|
|
||||||
{% endfor %}
|
|
||||||
</li>
|
|
||||||
{%- endif -%}
|
|
||||||
{% endif %}
|
|
||||||
{%- if t.socialIssuesVisible %}
|
|
||||||
{%- if activity.socialIssues is not empty -%}
|
|
||||||
<li class="social-issues">
|
|
||||||
{% for r in activity.socialIssues %}
|
|
||||||
{{ r|chill_entity_render_box }}
|
|
||||||
{% endfor %}
|
|
||||||
</li>
|
|
||||||
{%- endif -%}
|
|
||||||
{% endif %}
|
|
||||||
{%- if t.socialActionsVisible -%}
|
|
||||||
{%- if activity.socialActions is not empty -%}
|
|
||||||
<li class="social-actions">
|
|
||||||
{% for r in activity.socialActions %}
|
|
||||||
{{ r|chill_entity_render_box }}
|
|
||||||
{% endfor %}
|
|
||||||
</li>
|
|
||||||
{%- endif -%}
|
|
||||||
{% endif %}
|
|
||||||
</ul>
|
|
||||||
</span>
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
{% if context == 'person' and activity.accompanyingPeriod is not empty %}
|
|
||||||
<div class="mt-3">
|
|
||||||
<a class="btn btn-sm btn-outline-primary"
|
|
||||||
title="{{ 'Period number %number%'|trans({'%number%': activity.accompanyingPeriod.id}) }}"
|
|
||||||
href="{{ chill_path_add_return_path(
|
|
||||||
"chill_person_accompanying_course_index",
|
|
||||||
{ 'accompanying_period_id': activity.accompanyingPeriod.id }
|
|
||||||
) }}"><i class="fa fa-random"></i>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
@@ -3,6 +3,16 @@
|
|||||||
{{ path(pathname, parms) }}
|
{{ path(pathname, parms) }}
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
|
{% macro insert_onthefly(type, entity, parent = null) %}
|
||||||
|
{% include '@ChillMain/OnTheFly/_insert_vue_onthefly.html.twig' with {
|
||||||
|
action: 'show', displayBadge: true,
|
||||||
|
targetEntity: { name: type, id: entity.id },
|
||||||
|
buttonText: entity|chill_entity_render_string,
|
||||||
|
isDead: entity.deathdate is defined and entity.deathdate is not null,
|
||||||
|
parent: parent
|
||||||
|
} %}
|
||||||
|
{% endmacro %}
|
||||||
|
|
||||||
{% macro computeWidth(nbBlocks) %}
|
{% macro computeWidth(nbBlocks) %}
|
||||||
{{ 'flex-basis: ' ~ (100 / nbBlocks)|round(1) ~ '%;' }}
|
{{ 'flex-basis: ' ~ (100 / nbBlocks)|round(1) ~ '%;' }}
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
@@ -13,6 +23,7 @@
|
|||||||
{% set blocks = blocks|merge([{
|
{% set blocks = blocks|merge([{
|
||||||
'title': 'Others persons'|trans,
|
'title': 'Others persons'|trans,
|
||||||
'items': entity.persons,
|
'items': entity.persons,
|
||||||
|
'type': 'person',
|
||||||
'path' : 'chill_person_view',
|
'path' : 'chill_person_view',
|
||||||
'key' : 'person_id'
|
'key' : 'person_id'
|
||||||
}]) %}
|
}]) %}
|
||||||
@@ -20,11 +31,13 @@
|
|||||||
{% set blocks = blocks|merge([{
|
{% set blocks = blocks|merge([{
|
||||||
'title': 'Persons in accompanying course'|trans,
|
'title': 'Persons in accompanying course'|trans,
|
||||||
'items': entity.personsAssociated,
|
'items': entity.personsAssociated,
|
||||||
|
'type': 'person',
|
||||||
'path' : 'chill_person_view',
|
'path' : 'chill_person_view',
|
||||||
'key' : 'person_id'
|
'key' : 'person_id'
|
||||||
},{
|
},{
|
||||||
'title': 'Third persons'|trans,
|
'title': 'Third persons'|trans,
|
||||||
'items': entity.personsNotAssociated,
|
'items': entity.personsNotAssociated,
|
||||||
|
'type': 'person',
|
||||||
'path' : 'chill_person_view',
|
'path' : 'chill_person_view',
|
||||||
'key' : 'person_id',
|
'key' : 'person_id',
|
||||||
}]) %}
|
}]) %}
|
||||||
@@ -34,6 +47,7 @@
|
|||||||
{% set blocks = blocks|merge([{
|
{% set blocks = blocks|merge([{
|
||||||
'title': 'Third parties'|trans,
|
'title': 'Third parties'|trans,
|
||||||
'items': entity.thirdParties,
|
'items': entity.thirdParties,
|
||||||
|
'type': 'thirdparty',
|
||||||
'path' : 'chill_crud_3party_3party_view',
|
'path' : 'chill_crud_3party_3party_view',
|
||||||
'key' : 'id',
|
'key' : 'id',
|
||||||
}]) %}
|
}]) %}
|
||||||
@@ -42,11 +56,12 @@
|
|||||||
{% set blocks = blocks|merge([{
|
{% set blocks = blocks|merge([{
|
||||||
'title': 'Users concerned'|trans,
|
'title': 'Users concerned'|trans,
|
||||||
'items': entity.users,
|
'items': entity.users,
|
||||||
|
'type': 'user',
|
||||||
'key' : 'id',
|
'key' : 'id',
|
||||||
}]) %}
|
}]) %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if (with_display == 'bloc') %}
|
{% if (render == 'bloc') %}
|
||||||
<div class="{{ context }} flex-bloc concerned-groups">
|
<div class="{{ context }} flex-bloc concerned-groups">
|
||||||
{% for bloc in blocks %}
|
{% for bloc in blocks %}
|
||||||
|
|
||||||
@@ -59,22 +74,12 @@
|
|||||||
<ul class="list-content">
|
<ul class="list-content">
|
||||||
{% for item in bloc.items %}
|
{% for item in bloc.items %}
|
||||||
<li>
|
<li>
|
||||||
{% if bloc.path is defined %}
|
{% if bloc.type == 'user' %}
|
||||||
<a href="{{ _self.href(bloc.path, bloc.key, item.id) }}">
|
<span class="badge-user">
|
||||||
<span class="{% if (badge_person is defined and badge_person == true) %}badge-person{% else %}badge bg-primary{% endif %}">
|
{{ item|chill_entity_render_box({'render': 'raw', 'addAltNames': false }) }}
|
||||||
{{ item|chill_entity_render_box({
|
|
||||||
'render': 'raw',
|
|
||||||
'addAltNames': false
|
|
||||||
}) }}
|
|
||||||
</span>
|
</span>
|
||||||
</a>
|
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="{% if (badge_person is defined and badge_person == true) %}badge-person{% else %}badge bg-primary{% endif %}">
|
{{ _self.insert_onthefly(bloc.type, item) }}
|
||||||
{{ item|chill_entity_render_box({
|
|
||||||
'render': 'raw',
|
|
||||||
'addAltNames': false
|
|
||||||
}) }}
|
|
||||||
</span>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</li>
|
</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
@@ -87,7 +92,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if (with_display == 'row') %}
|
{% if (render == 'row') %}
|
||||||
<div class="concerned-groups">
|
<div class="concerned-groups">
|
||||||
{% for bloc in blocks %}
|
{% for bloc in blocks %}
|
||||||
<div class="group">
|
<div class="group">
|
||||||
@@ -96,20 +101,12 @@
|
|||||||
<ul class="list-content">
|
<ul class="list-content">
|
||||||
{% for item in bloc.items %}
|
{% for item in bloc.items %}
|
||||||
<li>
|
<li>
|
||||||
{% if bloc.path is defined %}
|
{% if bloc.type == 'user' %}
|
||||||
<a href="{{ _self.href(bloc.path, bloc.key, item.id) }}">
|
<span class="badge-user">
|
||||||
<span class="{% if (badge_person is defined and badge_person == true) %}badge-person{% else %}badge bg-primary{% endif %}">
|
{{ item|chill_entity_render_box({'render': 'raw', 'addAltNames': false }) }}
|
||||||
{{ item|chill_entity_render_box({
|
|
||||||
'render': 'raw',
|
|
||||||
'addAltNames': false
|
|
||||||
}) }}
|
|
||||||
</span>
|
</span>
|
||||||
</a>
|
|
||||||
{% else %}
|
{% else %}
|
||||||
{{ item|chill_entity_render_box({
|
{{ _self.insert_onthefly(bloc.type, item) }}
|
||||||
'render': 'raw',
|
|
||||||
'addAltNames': false
|
|
||||||
}) }}
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</li>
|
</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
@@ -120,30 +117,24 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if (with_display == 'wrap-list') %}
|
{% if (render == 'wrap-list') %}
|
||||||
<div class="concerned-groups wrap-list">
|
<div class="concerned-groups wrap-list">
|
||||||
{% for bloc in blocks %}
|
{% for bloc in blocks %}
|
||||||
<div class="wl-row">
|
<div class="wl-row">
|
||||||
{% if bloc.items|length > 0 %}
|
{% if bloc.items|length > 0 %}
|
||||||
<div class="wl-col title">
|
<div class="wl-col title">
|
||||||
<h4>{{ bloc.title }}</h4>
|
<h3>{{ bloc.title }}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="wl-col list">
|
<div class="wl-col list">
|
||||||
{% for item in bloc.items %}
|
{% for item in bloc.items %}
|
||||||
|
|
||||||
<span class="wl-item {% if (badge_person is defined and badge_person == true) %}badge-person{% else %}badge bg-primary{% endif %}">
|
<span class="wl-item">
|
||||||
{% if bloc.path is defined %}
|
{% if bloc.type == 'user' %}
|
||||||
<a href="{{ _self.href(bloc.path, bloc.key, item.id) }}">
|
<span class="badge-user">
|
||||||
{{ item|chill_entity_render_box({
|
{{ item|chill_entity_render_box({'render': 'raw', 'addAltNames': false }) }}
|
||||||
'render': 'raw',
|
</span>
|
||||||
'addAltNames': false
|
|
||||||
}) }}
|
|
||||||
</a>
|
|
||||||
{% else %}
|
{% else %}
|
||||||
{{ item|chill_entity_render_box({
|
{{ _self.insert_onthefly(bloc.type, item) }}
|
||||||
'render': 'raw',
|
|
||||||
'addAltNames': false
|
|
||||||
}) }}
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
|
@@ -1,5 +1,12 @@
|
|||||||
<h1>{{ "Update activity"|trans }}</h1>
|
<h1>
|
||||||
<h2 class="chill-green mb-4">{{ entity.type.name|localize_translatable_string }}</h2>
|
{{ "Update activity"|trans }}
|
||||||
|
</h1>
|
||||||
|
<h2 class="badge-title mb-5">
|
||||||
|
<span class="title_label"></span>
|
||||||
|
<span class="title_action">
|
||||||
|
{{ entity.type.name | localize_translatable_string }}
|
||||||
|
</span>
|
||||||
|
</h2>
|
||||||
|
|
||||||
{{ form_start(edit_form) }}
|
{{ form_start(edit_form) }}
|
||||||
{{ form_errors(edit_form) }}
|
{{ form_errors(edit_form) }}
|
||||||
@@ -37,7 +44,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{%- if edit_form.persons is defined or edit_form.thirdParties is defined or edit_form.users is defined -%}
|
{%- if edit_form.persons is defined or edit_form.thirdParties is defined or edit_form.users is defined -%}
|
||||||
<h2 class="chill-red">{{ 'Concerned groups'|trans }}</h2>
|
<h2 class="chill-blue">{{ 'Concerned groups'|trans }}</h2>
|
||||||
|
|
||||||
{%- if edit_form.persons is defined -%}
|
{%- if edit_form.persons is defined -%}
|
||||||
{{ form_widget(edit_form.persons) }}
|
{{ form_widget(edit_form.persons) }}
|
||||||
@@ -53,7 +60,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
<h2 class="chill-red">{{ 'Activity data'|trans }}</h2>
|
<h2 class="chill-blue">{{ 'Activity data'|trans }}</h2>
|
||||||
|
|
||||||
{%- if edit_form.date is defined -%}
|
{%- if edit_form.date is defined -%}
|
||||||
{{ form_row(edit_form.date) }}
|
{{ form_row(edit_form.date) }}
|
||||||
@@ -73,19 +80,18 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{%- if edit_form.comment is defined -%}
|
{%- if edit_form.comment is defined -%}
|
||||||
{# TODO .. public and private #}
|
|
||||||
{{ form_row(edit_form.comment) }}
|
{{ form_row(edit_form.comment) }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{%- if edit_form.documents is defined -%}
|
|
||||||
{{ form_row(edit_form.documents) }}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{%- if edit_form.attendee is defined -%}
|
{%- if edit_form.attendee is defined -%}
|
||||||
{{ form_row(edit_form.attendee) }}
|
{{ form_row(edit_form.attendee) }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{# TODO .. status #}
|
{%- if edit_form.documents is defined -%}
|
||||||
|
{{ form_row(edit_form.documents) }}
|
||||||
|
<div data-docgen-template-picker="data-docgen-template-picker" data-entity-class="Chill\ActivityBundle\Entity\Activity" data-entity-id="{{ entity.id }}"></div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
{% set person_id = null %}
|
{% set person_id = null %}
|
||||||
{% if entity.person %}
|
{% if entity.person %}
|
||||||
@@ -97,16 +103,16 @@
|
|||||||
{% set accompanying_course_id = accompanyingCourse.id %}
|
{% set accompanying_course_id = accompanyingCourse.id %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<ul class="record_actions sticky-form-buttons">
|
<ul class="record_actions sticky-form-buttons">
|
||||||
<li class="cancel">
|
<li class="cancel">
|
||||||
<a href="{{ path('chill_activity_activity_show', { 'id': entity.id, 'person_id': person_id, 'accompanying_period_id': accompanying_course_id } ) }}" class="btn btn-cancel">
|
<a href="{{ path('chill_activity_activity_show', { 'id': entity.id, 'person_id': person_id, 'accompanying_period_id': accompanying_course_id } ) }}" class="btn btn-cancel">
|
||||||
{{ 'Cancel'|trans }}
|
{{ 'Cancel'|trans }}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<button class="btn btn-update" type="submit">{{ 'Save'|trans }}</button>
|
<button class="btn btn-update" type="submit">{{ 'Save'|trans }}</button>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
{{ form_end(edit_form) }}
|
|
||||||
|
|
||||||
|
{{ form_end(edit_form) }}
|
||||||
{# {{ form(delete_form) }} #}
|
{# {{ form(delete_form) }} #}
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
{% block js %}
|
{% block js %}
|
||||||
{{ parent() }}
|
{{ parent() }}
|
||||||
{{ encore_entry_link_tags('mod_async_upload') }}
|
{{ encore_entry_script_tags('mod_async_upload') }}
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
window.addEventListener('DOMContentLoaded', function (e) {
|
window.addEventListener('DOMContentLoaded', function (e) {
|
||||||
chill.displayAlertWhenLeavingModifiedForm('form[name="{{ edit_form.vars.form.vars.name }}"]',
|
chill.displayAlertWhenLeavingModifiedForm('form[name="{{ edit_form.vars.form.vars.name }}"]',
|
||||||
|
@@ -30,7 +30,7 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block js %}
|
{% block js %}
|
||||||
{{ encore_entry_link_tags('mod_async_upload') }}
|
{{ encore_entry_script_tags('mod_async_upload') }}
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
window.addEventListener('DOMContentLoaded', function (e) {
|
window.addEventListener('DOMContentLoaded', function (e) {
|
||||||
chill.displayAlertWhenLeavingModifiedForm('form[name="{{ edit_form.vars.form.vars.name }}"]',
|
chill.displayAlertWhenLeavingModifiedForm('form[name="{{ edit_form.vars.form.vars.name }}"]',
|
||||||
|
@@ -1,3 +1,65 @@
|
|||||||
|
{% macro recordAction(activity, context = null, person_id = null, accompanying_course_id = null) %}
|
||||||
|
{% if is_granted('CHILL_ACTIVITY_SEE_DETAILS', activity) %}
|
||||||
|
{% if no_action is not defined or no_action == false %}
|
||||||
|
<li>
|
||||||
|
<a class="btn btn-misc" href="{{ chill_path_add_return_path('chill_main_notification_create', {
|
||||||
|
'entityClass': 'Chill\\ActivityBundle\\Entity\\Activity',
|
||||||
|
'entityId': activity.id
|
||||||
|
}) }}">
|
||||||
|
<i class="fa fa-paper-plane fa-fw"></i>
|
||||||
|
{{ 'notification.Notify'|trans }}</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% if context == 'person' and activity.accompanyingPeriod is not empty %}
|
||||||
|
{#
|
||||||
|
Disable person_id in following links, for redirect to accompanyingCourse context
|
||||||
|
#}
|
||||||
|
{% set person_id = null %}
|
||||||
|
{% set accompanying_course_id = activity.accompanyingPeriod.id %}
|
||||||
|
<li>
|
||||||
|
<a href="{{ chill_path_add_return_path('chill_activity_activity_list',{
|
||||||
|
'accompanying_period_id': accompanying_course_id
|
||||||
|
}) }}"
|
||||||
|
class="btn btn-primary"
|
||||||
|
title="{{ 'See activity in accompanying course context'|trans }}">
|
||||||
|
<i class="fa fa-random fa-fw"></i>
|
||||||
|
{{ 'Period number %number%'|trans({'%number%': accompanying_course_id}) }}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
<li>
|
||||||
|
<a href="{{ path('chill_activity_activity_show', {'id': activity.id,
|
||||||
|
'person_id': person_id,
|
||||||
|
'accompanying_period_id': accompanying_course_id
|
||||||
|
}) }}"
|
||||||
|
class="btn btn-show"
|
||||||
|
title="{{ 'Show'|trans }}"></a>
|
||||||
|
</li>
|
||||||
|
{% if no_action is not defined or no_action == false %}
|
||||||
|
{% if is_granted('CHILL_ACTIVITY_UPDATE', activity) %}
|
||||||
|
<li>
|
||||||
|
<a href="{{ path('chill_activity_activity_edit', {'id': activity.id,
|
||||||
|
'person_id': person_id,
|
||||||
|
'accompanying_period_id': accompanying_course_id
|
||||||
|
}) }}"
|
||||||
|
class="btn btn-update"
|
||||||
|
title="{{ 'Edit'|trans }}"></a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% if is_granted('CHILL_ACTIVITY_DELETE', activity) %}
|
||||||
|
<li>
|
||||||
|
<a href="{{ path('chill_activity_activity_delete', {'id': activity.id,
|
||||||
|
'person_id': person_id,
|
||||||
|
'accompanying_period_id': accompanying_course_id
|
||||||
|
}) }}"
|
||||||
|
class="btn btn-delete"
|
||||||
|
title="{{ 'Delete'|trans }}"></a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endmacro %}
|
||||||
|
|
||||||
<div class="context-{{ context }}">
|
<div class="context-{{ context }}">
|
||||||
|
|
||||||
{% if activities|length == 0 %}
|
{% if activities|length == 0 %}
|
||||||
@@ -8,56 +70,10 @@
|
|||||||
{% else %}
|
{% else %}
|
||||||
<div class="flex-table activity-list">
|
<div class="flex-table activity-list">
|
||||||
{% for activity in activities %}
|
{% for activity in activities %}
|
||||||
{% set t = activity.type %}
|
{% include 'ChillActivityBundle:Activity:_list_item.html.twig' with {
|
||||||
<div class="item-bloc">
|
'context': context,
|
||||||
<div class="item-row">
|
'recordAction': _self.recordAction(activity, context, person_id, accompanying_course_id)
|
||||||
{% include '@ChillActivity/Activity/activity-badge-title.html.twig' %}
|
} %}
|
||||||
</div>
|
|
||||||
|
|
||||||
{% if activity.comment.comment is not empty
|
|
||||||
or activity.persons|length > 0
|
|
||||||
or activity.thirdParties|length > 0
|
|
||||||
or activity.users|length > 0
|
|
||||||
%}
|
|
||||||
<div class="main">
|
|
||||||
{% if activity.comment.comment is not empty %}
|
|
||||||
{{ activity.comment|chill_entity_render_box({
|
|
||||||
'disable_markdown': false,
|
|
||||||
'limit_lines': 3,
|
|
||||||
'metadata': false,
|
|
||||||
}) }}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% include 'ChillActivityBundle:Activity:concernedGroups.html.twig' with {
|
|
||||||
'context': context,
|
|
||||||
'with_display': 'row',
|
|
||||||
'entity': activity,
|
|
||||||
'badge_person': true
|
|
||||||
} %}
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<div class="item-row separator">
|
|
||||||
<div class="updatedBy"></div>
|
|
||||||
<ul class="record_actions">
|
|
||||||
<li>
|
|
||||||
<a href="{{ path('chill_activity_activity_show', { 'id': activity.id, 'person_id': person_id, 'accompanying_period_id': accompanying_course_id }) }}"
|
|
||||||
class="btn btn-sm btn-show "></a>
|
|
||||||
</li>
|
|
||||||
{% if no_action is not defined or no_action == false %}
|
|
||||||
<li>
|
|
||||||
<a href="{{ path('chill_activity_activity_edit', { 'id': activity.id, 'person_id': person_id, 'accompanying_period_id': accompanying_course_id }) }}"
|
|
||||||
class="btn btn-sm btn-update "></a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="{{ path('chill_activity_activity_delete', { 'id': activity.id, 'person_id' : person_id, 'accompanying_period_id': accompanying_course_id } ) }}"
|
|
||||||
class="btn btn-sm btn-delete "></a>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@@ -4,6 +4,17 @@
|
|||||||
|
|
||||||
{% block title %}{{ 'Activity list' |trans }}{% endblock title %}
|
{% block title %}{{ 'Activity list' |trans }}{% endblock title %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block js %}
|
||||||
|
{{ parent() }}
|
||||||
|
{{ encore_entry_script_tags('mod_notification_toggle_read_status') }}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block css %}
|
||||||
|
{{ parent() }}
|
||||||
|
{{ encore_entry_link_tags('mod_notification_toggle_read_status') }}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
{% set person_id = null %}
|
{% set person_id = null %}
|
||||||
@@ -23,8 +34,8 @@
|
|||||||
{% if is_granted('CHILL_ACTIVITY_CREATE', accompanyingCourse) %}
|
{% if is_granted('CHILL_ACTIVITY_CREATE', accompanyingCourse) %}
|
||||||
<ul class="record_actions sticky-form-buttons">
|
<ul class="record_actions sticky-form-buttons">
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ path('chill_activity_activity_new', {'person_id': person_id, 'accompanying_period_id': accompanying_course_id}) }}" class="btn btn-create">
|
<a href="{{ path('chill_activity_activity_new', {'person_id': person_id, 'accompanying_period_id': accompanying_course_id}) }}"
|
||||||
{{ 'Create'|trans }}
|
class="btn btn-create">{{ 'Create'|trans }}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@@ -20,6 +20,16 @@
|
|||||||
|
|
||||||
{% block title %}{{ 'Activity list' |trans }}{% endblock title %}
|
{% block title %}{{ 'Activity list' |trans }}{% endblock title %}
|
||||||
|
|
||||||
|
{% block js %}
|
||||||
|
{{ parent() }}
|
||||||
|
{{ encore_entry_script_tags('mod_notification_toggle_read_status') }}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block css %}
|
||||||
|
{{ parent() }}
|
||||||
|
{{ encore_entry_link_tags('mod_notification_toggle_read_status') }}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block personcontent %}
|
{% block personcontent %}
|
||||||
|
|
||||||
{% set person_id = null %}
|
{% set person_id = null %}
|
||||||
|
@@ -3,10 +3,88 @@
|
|||||||
{% set t = activity.type %}
|
{% set t = activity.type %}
|
||||||
|
|
||||||
<a href="{{ path('chill_activity_activity_show', { 'id': activity.id, 'person_id': person_id, 'accompanying_period_id': accompanying_course_id }) }}"
|
<a href="{{ path('chill_activity_activity_show', { 'id': activity.id, 'person_id': person_id, 'accompanying_period_id': accompanying_course_id }) }}"
|
||||||
class="badge-link" title="{{ 'Show the activity'|trans }}">
|
class="dashboard-link" title="{{ 'Show the activity'|trans }}">
|
||||||
|
|
||||||
{% include '@ChillActivity/Activity/activity-badge-title.html.twig' %}
|
<div class="dashboard">
|
||||||
|
<span class="title_label"></span>
|
||||||
|
<span class="title_action">
|
||||||
|
|
||||||
|
{%- if activity.date -%}
|
||||||
|
<p class="date-label">{{ activity.date|format_date('short') }}</p>
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
<span class="like-h3">{{ activity.type.name|localize_translatable_string }}</span>
|
||||||
|
|
||||||
|
{% if activity.emergency %}
|
||||||
|
<span class="badge bg-danger rounded-pill fs-6">{{ 'Emergency'|trans|upper }}</span>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<ul class="small_in_title mt-3">
|
||||||
|
|
||||||
|
{% if activity.sentReceived is not empty and t.sentReceivedVisible %}
|
||||||
|
<li>
|
||||||
|
<span class="item-key">{{ 'Sent received'|trans ~ ' : ' }}</span>
|
||||||
|
<b>{{ activity.sentReceived|capitalize|trans }}</b>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if activity.location and t.locationVisible %}
|
||||||
|
<li>
|
||||||
|
<span class="item-key">{{ 'location'|trans ~ ': ' }}</span>
|
||||||
|
<b>
|
||||||
|
<span>{{ activity.location.locationType.title|localize_translatable_string }}</span>
|
||||||
|
{{ activity.location.name }}
|
||||||
|
</b>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if activity.user and t.userVisible %}
|
||||||
|
<li>
|
||||||
|
<span class="item-key">{{ 'Referrer'|trans ~ ': ' }}</span>
|
||||||
|
<b>{{ activity.user|chill_entity_render_box}}</b>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<li class="associated-persons">
|
||||||
|
<span class="item-key">{{ 'Participants'|trans ~ ' : ' }}</span>
|
||||||
|
{% for p in activity.personsAssociated %}
|
||||||
|
<span class="badge-person">{{ p|chill_entity_render_box({'addAgeBadge': true}) }}</span>
|
||||||
|
{% endfor %}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<ul class="list-content my-3">
|
||||||
|
{%- if t.reasonsVisible -%}
|
||||||
|
{%- if activity.reasons is not empty -%}
|
||||||
|
<li class="reasons">
|
||||||
|
{% for r in activity.reasons %}
|
||||||
|
{{ r|chill_entity_render_box }}
|
||||||
|
{% endfor %}
|
||||||
|
</li>
|
||||||
|
{%- endif -%}
|
||||||
|
{% endif %}
|
||||||
|
{%- if t.socialIssuesVisible %}
|
||||||
|
{%- if activity.socialIssues is not empty -%}
|
||||||
|
<li class="social-issues">
|
||||||
|
{% for r in activity.socialIssues %}
|
||||||
|
{{ r|chill_entity_render_box }}
|
||||||
|
{% endfor %}
|
||||||
|
</li>
|
||||||
|
{%- endif -%}
|
||||||
|
{% endif %}
|
||||||
|
{%- if t.socialActionsVisible -%}
|
||||||
|
{%- if activity.socialActions is not empty -%}
|
||||||
|
<li class="social-actions">
|
||||||
|
{% for r in activity.socialActions %}
|
||||||
|
{{ r|chill_entity_render_box }}
|
||||||
|
{% endfor %}
|
||||||
|
</li>
|
||||||
|
{%- endif -%}
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
|
@@ -1,10 +1,16 @@
|
|||||||
<h1>{{ "Activity creation"|trans ~ ' :' }}</h1>
|
<h1>
|
||||||
<h2 class="chill-green mb-4">{{ entity.type.name|localize_translatable_string }}</h2>
|
{{ "Activity creation"|trans }}
|
||||||
|
</h1>
|
||||||
|
<h2 class="badge-title mb-5">
|
||||||
|
<span class="title_label"></span>
|
||||||
|
<span class="title_action">
|
||||||
|
{{ entity.type.name | localize_translatable_string }}
|
||||||
|
</span>
|
||||||
|
</h2>
|
||||||
|
|
||||||
{{ form_start(form) }}
|
{{ form_start(form) }}
|
||||||
{{ form_errors(form) }}
|
{{ form_errors(form) }}
|
||||||
|
|
||||||
|
|
||||||
{%- if form.emergency is defined -%}
|
{%- if form.emergency is defined -%}
|
||||||
{{ form_row(form.emergency) }}
|
{{ form_row(form.emergency) }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -39,7 +45,7 @@
|
|||||||
|
|
||||||
{%- if form.persons is defined or form.thirdParties is defined or form.users is defined -%}
|
{%- if form.persons is defined or form.thirdParties is defined or form.users is defined -%}
|
||||||
|
|
||||||
<h2 class="chill-red">{{ 'Concerned groups'|trans }}</h2>
|
<h2 class="chill-blue">{{ 'Concerned groups'|trans }}</h2>
|
||||||
|
|
||||||
{%- if form.persons is defined -%}
|
{%- if form.persons is defined -%}
|
||||||
{{ form_widget(form.persons) }}
|
{{ form_widget(form.persons) }}
|
||||||
@@ -55,7 +61,7 @@
|
|||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<h2 class="chill-red">{{ 'Activity data'|trans }}</h2>
|
<h2 class="chill-blue">{{ 'Activity data'|trans }}</h2>
|
||||||
|
|
||||||
{%- if form.date is defined -%}
|
{%- if form.date is defined -%}
|
||||||
{{ form_row(form.date) }}
|
{{ form_row(form.date) }}
|
||||||
@@ -81,6 +87,7 @@
|
|||||||
|
|
||||||
{%- if form.documents is defined -%}
|
{%- if form.documents is defined -%}
|
||||||
{{ form_row(form.documents) }}
|
{{ form_row(form.documents) }}
|
||||||
|
<div data-docgen-template-picker="data-docgen-template-picker" data-entity-class="Chill\ActivityBundle\Entity\Activity" data-entity-id="{{ entity.id }}"></div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{%- if form.attendee is defined -%}
|
{%- if form.attendee is defined -%}
|
||||||
@@ -103,7 +110,7 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<button class="btn btn-create" type="submit">
|
<button class="btn btn-save" type="submit">
|
||||||
{{ 'Create'|trans }}
|
{{ 'Create'|trans }}
|
||||||
</button>
|
</button>
|
||||||
</li>
|
</li>
|
||||||
|
@@ -17,10 +17,6 @@
|
|||||||
{{ parent() }}
|
{{ parent() }}
|
||||||
{{ encore_entry_script_tags('mod_async_upload') }}
|
{{ encore_entry_script_tags('mod_async_upload') }}
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
window.addEventListener('DOMContentLoaded', function (e) {
|
|
||||||
chill.displayAlertWhenLeavingUnsubmittedForm('form[name="{{ form.vars.form.vars.name }}"]',
|
|
||||||
'{{ "You are going to leave a page with unsubmitted data. Are you sure you want to leave ?"|trans }}');
|
|
||||||
});
|
|
||||||
window.activity = {{ activity_json|json_encode|raw }};
|
window.activity = {{ activity_json|json_encode|raw }};
|
||||||
{% if default_location is not null %}window.default_location_id = {{ default_location.id }}{% endif %};
|
{% if default_location is not null %}window.default_location_id = {{ default_location.id }}{% endif %};
|
||||||
</script>
|
</script>
|
||||||
|
@@ -14,7 +14,7 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block js %}
|
{% block js %}
|
||||||
{{ encore_entry_link_tags('mod_async_upload') }}
|
{{ encore_entry_script_tags('mod_async_upload') }}
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
window.addEventListener('DOMContentLoaded', function (e) {
|
window.addEventListener('DOMContentLoaded', function (e) {
|
||||||
chill.displayAlertWhenLeavingUnsubmittedForm('form[name="{{ form.vars.form.vars.name }}"]',
|
chill.displayAlertWhenLeavingUnsubmittedForm('form[name="{{ form.vars.form.vars.name }}"]',
|
||||||
|
@@ -25,7 +25,7 @@
|
|||||||
'activityData': activityData
|
'activityData': activityData
|
||||||
}) }}">
|
}) }}">
|
||||||
|
|
||||||
<div class="bloc btn btn-primary btn-lg btn-block">
|
<div class="btn btn-primary">
|
||||||
{{ activityType.name|localize_translatable_string }}
|
{{ activityType.name|localize_translatable_string }}
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
|
@@ -1,128 +1,188 @@
|
|||||||
{%- set t = entity.type -%}
|
{%- set t = entity.type -%}
|
||||||
{%- import "@ChillDocStore/Macro/macro.html.twig" as m -%}
|
{%- import "@ChillDocStore/Macro/macro.html.twig" as m -%}
|
||||||
|
|
||||||
<h1>
|
<h1>{{ "Activity"|trans }}</h1>
|
||||||
{{ "Activity"|trans }}
|
|
||||||
{%- if t.emergencyVisible and entity.emergency -%}
|
|
||||||
<span class="badge bg-secondary">
|
|
||||||
{{- 'Emergency'|trans -}}
|
|
||||||
</span>
|
|
||||||
{%- endif -%}
|
|
||||||
</h1>
|
|
||||||
|
|
||||||
<dl class="chill_view_data">
|
<div class="flex-table">
|
||||||
|
<div class="item-bloc">
|
||||||
|
|
||||||
<dt class="inline">{{ 'by'|trans|capitalize }}</dt>
|
<div class="item-row">
|
||||||
<dd>{{ entity.user }}</dd>
|
<div class="wrap-list">
|
||||||
|
<div class="wl-row">
|
||||||
|
<div class="wl-col title">
|
||||||
|
{% if entity.date %}
|
||||||
|
<p class="date-label">
|
||||||
|
{{ entity.date|format_date('short') }}
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<div class="wl-col list">
|
||||||
|
<h2 class="badge-title">
|
||||||
|
<span class="title_label"></span>
|
||||||
|
<span class="title_action">
|
||||||
|
{{ entity.type.name | localize_translatable_string }}
|
||||||
|
{% if entity.emergency %}
|
||||||
|
<span class="badge bg-danger rounded-pill fs-6 float-end">{{ 'Emergency'|trans|upper }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</span>
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<dt class="inline">{{ 'Type'|trans }}</dt>
|
<div class="item-row separator">
|
||||||
<dd>{{ entity.type.name | localize_translatable_string }}</dd>
|
<dl class="chill_view_data">
|
||||||
|
<dt class="inline">{{ 'Referrer'|trans|capitalize }}</dt>
|
||||||
|
<dd>{{ entity.user|chill_entity_render_box }}</dd>
|
||||||
|
|
||||||
{%- if entity.scope -%}
|
{%- if entity.scope -%}
|
||||||
<dt class="inline">{{ 'Scope'|trans }}</dt>
|
<dt class="inline">{{ 'Scope'|trans }}</dt>
|
||||||
<dd><span class="scope">{{ entity.scope.name|localize_translatable_string }}</span></dd>
|
<dd>
|
||||||
{% endif %}
|
<span class="scope">{{ entity.scope.name|localize_translatable_string }}</span>
|
||||||
|
</dd>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% if t.socialIssuesVisible %}
|
{% if t.socialIssuesVisible %}
|
||||||
<dt class="inline">{{ 'Social issues'|trans }}</dt>
|
<dt class="inline">{{ 'Social issues'|trans }}</dt>
|
||||||
<dd>
|
<dd>
|
||||||
{% if entity.socialIssues|length == 0 %}
|
{% if entity.socialIssues|length == 0 %}
|
||||||
<p class="chill-no-data-statement">{{ 'No social issues associated'|trans }}</p>
|
<p class="chill-no-data-statement">{{ 'No social issues associated'|trans }}</p>
|
||||||
{% else %}
|
{% else %}
|
||||||
{% for si in entity.socialIssues %}{{ si|chill_entity_render_box }}{% endfor %}
|
{% for si in entity.socialIssues %}{{ si|chill_entity_render_box }}{% endfor %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</dd>
|
</dd>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if t.socialActionsVisible %}
|
{% if t.socialActionsVisible %}
|
||||||
<dt class="inline">{{ 'Social actions'|trans }}</dt>
|
<dt class="inline">{{ 'Social actions'|trans }}</dt>
|
||||||
<dd>
|
<dd>
|
||||||
{% if entity.socialActions|length == 0 %}
|
{% if entity.socialActions|length == 0 %}
|
||||||
<p class="chill-no-data-statement">{{ 'No social actions associated'|trans }}</p>
|
<span class="chill-no-data-statement">{{ 'No social actions associated'|trans }}</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
{% for sa in entity.socialActions %}{{ sa|chill_entity_render_box }}{% endfor %}
|
{% for sa in entity.socialActions %}{{ sa|chill_entity_render_box }}{% endfor %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</dd>
|
</dd>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if t.reasonsVisible %}
|
{% if t.reasonsVisible %}
|
||||||
<dt class="inline">{{ 'Reasons'|trans }}</dt>
|
<dt class="inline">{{ 'Reasons'|trans }}</dt>
|
||||||
{%- if entity.reasons is empty -%}
|
<dd>
|
||||||
<dd><span class="chill-no-data-statement">{{ 'No reason associated'|trans }}</span></dd>
|
{%- if entity.reasons is empty -%}
|
||||||
{%- else -%}
|
<span class="chill-no-data-statement">{{ 'No reason associated'|trans }}</span>
|
||||||
<dd>{% for r in entity.reasons %}{{ r|chill_entity_render_box }} {% endfor %}</dd>
|
{%- else -%}
|
||||||
{%- endif -%}
|
{% for r in entity.reasons %}{{ r|chill_entity_render_box }}{% endfor %}
|
||||||
{% endif %}
|
{%- endif -%}
|
||||||
|
</dd>
|
||||||
|
{% endif %}
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
|
||||||
<h2 class="chill-red">{{ 'Concerned groups'|trans }}</h2>
|
</div>
|
||||||
{% include 'ChillActivityBundle:Activity:concernedGroups.html.twig' with {'context': context, 'with_display': 'bloc', 'badge_person': 'true' } %}
|
</div>
|
||||||
|
|
||||||
<h2 class="chill-red">{{ 'Activity data'|trans }}</h2>
|
<h2 class="chill-blue">{{ 'Concerned groups'|trans }}</h2>
|
||||||
|
|
||||||
<dt class="inline">{{ 'Date'|trans }}</dt>
|
{% include 'ChillActivityBundle:Activity:concernedGroups.html.twig' with {
|
||||||
<dd>{{ entity.date|format_date('long') }}</dd>
|
'context': context,
|
||||||
|
'render': 'bloc',
|
||||||
|
'badge_person': true
|
||||||
|
} %}
|
||||||
|
|
||||||
{% if t.locationVisible %}
|
<h2 class="chill-blue">{{ 'Activity data'|trans }}</h2>
|
||||||
<dt class="inline">{{ 'Activity location'|trans }}</dt>
|
|
||||||
<dd>
|
<div class="flex-table">
|
||||||
{% if entity.location is not null %}
|
<div class="item-bloc">
|
||||||
<p>
|
|
||||||
{{ entity.location.name }}
|
<dl class="chill_view_data">
|
||||||
<span> ({{ entity.location.locationType.title|localize_translatable_string }})</span>
|
<dt class="inline">{{ 'Date'|trans }}</dt>
|
||||||
</p>
|
<dd>{{ entity.date|format_date('long') }}</dd>
|
||||||
{{ entity.location.address|chill_entity_render_box }}
|
|
||||||
{% else %}
|
{% if t.locationVisible %}
|
||||||
<span class="chill-no-data-statement">{{ 'No address given'|trans }}</span>
|
<dt class="inline">{{ 'Activity location'|trans }}</dt>
|
||||||
|
<dd>
|
||||||
|
{% if entity.location is not null %}
|
||||||
|
<p>
|
||||||
|
{{ entity.location.name }}
|
||||||
|
<span>({{ entity.location.locationType.title|localize_translatable_string }})</span>
|
||||||
|
</p>
|
||||||
|
<div class="ms-3">{{ entity.location.address|chill_entity_render_box }}</div>
|
||||||
|
{% else %}
|
||||||
|
<span class="chill-no-data-statement">{{ 'No address given'|trans }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</dd>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</dd>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if t.durationTimeVisible %}
|
{% if t.durationTimeVisible and is_granted('CHILL_ACTIVITY_SEE_DETAILS', entity) %}
|
||||||
<dt class="inline">{{ 'Duration Time'|trans }}</dt>
|
<dt class="inline">{{ 'Duration Time'|trans }}</dt>
|
||||||
<dd>{% if entity.durationTime is not null %}
|
<dd>
|
||||||
{{ entity.durationTime|date('H:i') }}
|
{% if entity.durationTime is not null %}
|
||||||
{% else %}
|
{{ entity.durationTime|date('H:i') }}
|
||||||
{{ 'None'|trans|capitalize }}
|
{% else %}
|
||||||
{% endif %}
|
<span class="chill-no-data-statement">{{ 'None'|trans|capitalize }}</span>
|
||||||
</dd>
|
{% endif %}
|
||||||
{% endif %}
|
</dd>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% if t.travelTimeVisible %}
|
{% if t.travelTimeVisible and is_granted('CHILL_ACTIVITY_SEE_DETAILS', entity) %}
|
||||||
<dt class="inline">{{ 'Travel time'|trans }}</dt>
|
<dt class="inline">{{ 'Travel time'|trans }}</dt>
|
||||||
<dd>{% if entity.travelTime is not null %}
|
<dd>
|
||||||
{{ entity.travelTime|date('H:i') }}
|
{% if entity.travelTime is not null %}
|
||||||
{% else %}
|
{{ entity.travelTime|date('H:i') }}
|
||||||
{{ 'None'|trans|capitalize }}
|
{% else %}
|
||||||
{% endif %}
|
<span class="chill-no-data-statement">{{ 'None'|trans|capitalize }}</span>
|
||||||
</dd>
|
{% endif %}
|
||||||
{% endif %}
|
</dd>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% if t.commentVisible %}
|
{% if t.commentVisible and is_granted('CHILL_ACTIVITY_SEE_DETAILS', entity) %}
|
||||||
<dt class="inline">{{ 'activity.comment'|trans }}</dt>
|
<dt class="inline">{{ 'activity.comment'|trans }}</dt>
|
||||||
{%- if entity.comment.empty -%}
|
<dd>
|
||||||
<dd><span class="chill-no-data-statement">{{ 'No comment associated'|trans }}</span></dd>
|
{%- if entity.comment.empty -%}
|
||||||
{%- else -%}
|
<span class="chill-no-data-statement">{{ 'No comment associated'|trans }}</span>
|
||||||
<dd>{{ entity.comment|chill_entity_render_box }}</dd>
|
{%- else -%}
|
||||||
{%- endif -%}
|
{{ entity.comment|chill_entity_render_box }}
|
||||||
{% endif %}
|
{%- endif -%}
|
||||||
|
</dd>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% if t.documentsVisible and entity.documents|length > 0 %}
|
{% if t.documentsVisible and is_granted('CHILL_ACTIVITY_SEE_DETAILS', entity) %}
|
||||||
<dt>{{ 'Documents'|trans }}</dt>
|
<dt class="inline">{{ 'Documents'|trans }}</dt>
|
||||||
<dd>
|
<dd>
|
||||||
<ul>
|
{% if entity.documents|length > 0 %}
|
||||||
{% for d in entity.documents %}
|
<ul>
|
||||||
<li>{{ m.download_button(d) }}</li>
|
{% for d in entity.documents %}
|
||||||
{% endfor %}
|
<li>{{ m.download_button(d) }}</li>
|
||||||
</ul>
|
{% endfor %}
|
||||||
</dd>
|
</ul>
|
||||||
{% endif %}
|
{% else %}
|
||||||
|
<span class="chill-no-data-statement">{{ 'Any document found'|trans }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</dd>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% if t.attendeeVisible %}
|
{% if t.attendeeVisible and is_granted('CHILL_ACTIVITY_SEE_DETAILS', entity) %}
|
||||||
<dt class="inline">{{ 'Attendee'|trans }}</dt>
|
<dt class="inline">{{ 'Attendee'|trans }}</dt>
|
||||||
<dd>{% if entity.attendee is not null %}{% if entity.attendee %}{{ 'present'|trans|capitalize }} {% else %} {{ 'not present'|trans|capitalize }}{% endif %}{% else %}{{ 'None'|trans|capitalize }}{% endif %}</dd>
|
<dd>
|
||||||
{% endif %}
|
{% if entity.attendee is not null %}
|
||||||
|
{{ entity.attendee.name|localize_translatable_string }}
|
||||||
|
{% else %}
|
||||||
|
<span class="chill-no-data-statement">{{ 'None'|trans|capitalize }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</dd>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="notification notification-list">
|
||||||
|
{% set notifications = chill_list_notifications('Chill\\ActivityBundle\\Entity\\Activity', entity.id) %}
|
||||||
|
{% if notifications is not empty %}
|
||||||
|
{{ notifications|raw }}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
{% set person_id = null %}
|
{% set person_id = null %}
|
||||||
{% if person %}
|
{% if person %}
|
||||||
@@ -141,22 +201,20 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a class="btn btn-update" href="{{ path('chill_activity_activity_edit', { 'id': entity.id, 'person_id': person_id, 'accompanying_period_id': accompanying_course_id }) }}">
|
<a class="btn btn-notify" href="{{ chill_path_add_return_path('chill_main_notification_create', {'entityClass': 'Chill\\ActivityBundle\\Entity\\Activity', 'entityId': entity.id}) }}">
|
||||||
{{ 'Edit'|trans }}
|
{{ 'notification.Notify'|trans }}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
{% if is_granted('CHILL_ACTIVITY_UPDATE', entity) %}
|
||||||
{# TODO
|
<li>
|
||||||
{% if is_granted('CHILL_ACTIVITY_DELETE', entity) %}
|
<a href="{{ path('chill_activity_activity_edit', { 'id': entity.id, 'person_id': person_id, 'accompanying_period_id': accompanying_course_id }) }}"
|
||||||
#}
|
class="btn btn-update">{{ 'Edit'|trans }}</a>
|
||||||
|
</li>
|
||||||
<li>
|
{% endif %}
|
||||||
<a href="{{ path('chill_activity_activity_delete', { 'id': entity.id, 'person_id' : person_id, 'accompanying_period_id': accompanying_course_id } ) }}" class="btn btn-delete">
|
{% if is_granted('CHILL_ACTIVITY_DELETE', entity) %}
|
||||||
{{ 'Delete'|trans }}
|
<li>
|
||||||
</a>
|
<a href="{{ path('chill_activity_activity_delete', { 'id': entity.id, 'person_id' : person_id, 'accompanying_period_id': accompanying_course_id } ) }}"
|
||||||
</li>
|
class="btn btn-delete" title="{{ 'Delete'|trans }}"></a>
|
||||||
|
</li>
|
||||||
{#
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
#}
|
|
||||||
</ul>
|
</ul>
|
||||||
|
@@ -4,12 +4,26 @@
|
|||||||
|
|
||||||
{% block title 'Show the activity'|trans %}
|
{% block title 'Show the activity'|trans %}
|
||||||
|
|
||||||
|
{% block js %}
|
||||||
|
{{ parent() }}
|
||||||
|
{{ encore_entry_script_tags('mod_notification_toggle_read_status') }}
|
||||||
|
{{ encore_entry_script_tags('mod_async_upload') }}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block css %}
|
||||||
|
{{ parent() }}
|
||||||
|
{{ encore_entry_link_tags('mod_notification_toggle_read_status') }}
|
||||||
|
{{ encore_entry_link_tags('mod_async_upload') }}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% import 'ChillActivityBundle:ActivityReason:macro.html.twig' as m %}
|
{% import 'ChillActivityBundle:ActivityReason:macro.html.twig' as m %}
|
||||||
|
|
||||||
{% block content -%}
|
{% block content -%}
|
||||||
<div class="activity-show">
|
<div class="activity-show">
|
||||||
|
|
||||||
{% include 'ChillActivityBundle:Activity:show.html.twig' with {'context': 'accompanyingCourse'} %}
|
{% include 'ChillActivityBundle:Activity:show.html.twig' with {'context': 'accompanyingCourse'} %}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|
||||||
|
{% block block_post_menu %}
|
||||||
|
<div class="post-menu pt-4"></div>
|
||||||
|
{% endblock %}
|
||||||
|
@@ -1,2 +1,27 @@
|
|||||||
|
{% macro recordAction(activity) %}
|
||||||
|
<li>
|
||||||
|
<a href="{{ path('chill_activity_activity_show', {'id': activity.id }) }}"
|
||||||
|
class="btn btn-show" title="{{ 'Show the activity'|trans }}"></a>
|
||||||
|
</li>
|
||||||
|
{% endmacro %}
|
||||||
|
|
||||||
<a href="{{ path('chill_activity_activity_show', {'id': notification.relatedEntityId }) }}">Go to Activity</a>
|
{% if activity is not null %}
|
||||||
|
<div class="flex-table">
|
||||||
|
{% if is_granted('CHILL_ACTIVITY_SEE', activity) %}
|
||||||
|
{% include 'ChillActivityBundle:Activity:_list_item.html.twig' with {
|
||||||
|
'recordAction': _self.recordAction(activity),
|
||||||
|
'context': 'accompanyingCourse',
|
||||||
|
'itemBlocClass': 'bg-chill-llight-gray'
|
||||||
|
} %}
|
||||||
|
{% else %}
|
||||||
|
<div class="alert alert-warning border-warning border-1">
|
||||||
|
{{ 'This is the minimal activity data'|trans ~ ': ' ~ activity.id }}<br>
|
||||||
|
{{ 'you are not allowed to see it details'|trans }}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<div class="alert alert-warning border-warning border-1">
|
||||||
|
{{ 'You get notified of an activity which does not exists any more'|trans }}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
@@ -4,12 +4,39 @@
|
|||||||
|
|
||||||
{% block title 'Show the activity'|trans %}
|
{% block title 'Show the activity'|trans %}
|
||||||
|
|
||||||
|
{% block js %}
|
||||||
|
{{ parent() }}
|
||||||
|
{{ encore_entry_script_tags('mod_notification_toggle_read_status') }}
|
||||||
|
{{ encore_entry_link_tags('mod_async_upload') }}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block css %}
|
||||||
|
{{ parent() }}
|
||||||
|
{{ encore_entry_link_tags('mod_notification_toggle_read_status') }}
|
||||||
|
{{ encore_entry_link_tags('mod_async_upload') }}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% import 'ChillActivityBundle:ActivityReason:macro.html.twig' as m %}
|
{% import 'ChillActivityBundle:ActivityReason:macro.html.twig' as m %}
|
||||||
|
|
||||||
{% block personcontent -%}
|
{% block personcontent -%}
|
||||||
<div class="activity-show">
|
<div class="activity-show">
|
||||||
|
{% include 'ChillActivityBundle:Activity:show.html.twig' with {'context': 'person'} %}
|
||||||
{% include 'ChillActivityBundle:Activity:show.html.twig' with {'context': 'person'} %}
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
{% endblock personcontent %}
|
{% endblock personcontent %}
|
||||||
|
|
||||||
|
{% block block_post_menu %}
|
||||||
|
<div class="post-menu pt-4">
|
||||||
|
|
||||||
|
<div class="d-grid gap-2">
|
||||||
|
<a class="btn btn-notify" href="{{ chill_path_add_return_path('chill_main_notification_create', {'entityClass': 'Chill\\ActivityBundle\\Entity\\Activity', 'entityId': entity.id}) }}">
|
||||||
|
{{ 'notification.Notify'|trans }}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% set notifications = chill_list_notifications('Chill\\ActivityBundle\\Entity\\Activity', entity.id) %}
|
||||||
|
{% if notifications is not empty %}
|
||||||
|
{{ notifications|raw }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
@@ -15,6 +15,7 @@ use Chill\MainBundle\Entity\Center;
|
|||||||
use Chill\MainBundle\Security\Authorization\AbstractChillVoter;
|
use Chill\MainBundle\Security\Authorization\AbstractChillVoter;
|
||||||
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
|
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
|
||||||
use Chill\MainBundle\Security\ProvideRoleHierarchyInterface;
|
use Chill\MainBundle\Security\ProvideRoleHierarchyInterface;
|
||||||
|
|
||||||
use function in_array;
|
use function in_array;
|
||||||
|
|
||||||
class ActivityStatsVoter extends AbstractChillVoter implements ProvideRoleHierarchyInterface
|
class ActivityStatsVoter extends AbstractChillVoter implements ProvideRoleHierarchyInterface
|
||||||
@@ -64,8 +65,10 @@ class ActivityStatsVoter extends AbstractChillVoter implements ProvideRoleHierar
|
|||||||
|
|
||||||
protected function supports($attribute, $subject)
|
protected function supports($attribute, $subject)
|
||||||
{
|
{
|
||||||
if ($subject instanceof Center
|
if (
|
||||||
&& in_array($attribute, $this->getAttributes(), true)) {
|
$subject instanceof Center
|
||||||
|
&& in_array($attribute, $this->getAttributes(), true)
|
||||||
|
) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -24,6 +24,7 @@ use Chill\PersonBundle\Security\Authorization\PersonVoter;
|
|||||||
use RuntimeException;
|
use RuntimeException;
|
||||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||||
use Symfony\Component\Security\Core\Security;
|
use Symfony\Component\Security\Core\Security;
|
||||||
|
|
||||||
use function in_array;
|
use function in_array;
|
||||||
|
|
||||||
class ActivityVoter extends AbstractChillVoter implements ProvideRoleHierarchyInterface
|
class ActivityVoter extends AbstractChillVoter implements ProvideRoleHierarchyInterface
|
||||||
@@ -92,6 +93,8 @@ class ActivityVoter extends AbstractChillVoter implements ProvideRoleHierarchyIn
|
|||||||
public function getRoles(): array
|
public function getRoles(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
|
self::SEE,
|
||||||
|
self::SEE_DETAILS,
|
||||||
self::CREATE_PERSON,
|
self::CREATE_PERSON,
|
||||||
self::CREATE_ACCOMPANYING_COURSE,
|
self::CREATE_ACCOMPANYING_COURSE,
|
||||||
self::UPDATE,
|
self::UPDATE,
|
||||||
|
@@ -0,0 +1,216 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Chill\ActivityBundle\Service\DocGenerator;
|
||||||
|
|
||||||
|
use Chill\ActivityBundle\Entity\Activity;
|
||||||
|
use Chill\DocGeneratorBundle\Context\DocGeneratorContextWithAdminFormInterface;
|
||||||
|
use Chill\DocGeneratorBundle\Context\DocGeneratorContextWithPublicFormInterface;
|
||||||
|
use Chill\DocGeneratorBundle\Context\Exception\UnexpectedTypeException;
|
||||||
|
use Chill\DocGeneratorBundle\Entity\DocGeneratorTemplate;
|
||||||
|
use Chill\DocGeneratorBundle\Service\Context\BaseContextData;
|
||||||
|
use Chill\DocStoreBundle\Entity\StoredObject;
|
||||||
|
use Chill\DocStoreBundle\Repository\DocumentCategoryRepository;
|
||||||
|
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
|
||||||
|
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
||||||
|
use Chill\PersonBundle\Entity\Person;
|
||||||
|
use Chill\PersonBundle\Templating\Entity\PersonRender;
|
||||||
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
|
||||||
|
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
|
||||||
|
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
||||||
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
|
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
||||||
|
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||||
|
|
||||||
|
class ActivityContext implements
|
||||||
|
DocGeneratorContextWithAdminFormInterface,
|
||||||
|
DocGeneratorContextWithPublicFormInterface
|
||||||
|
{
|
||||||
|
private BaseContextData $baseContextData;
|
||||||
|
|
||||||
|
private DocumentCategoryRepository $documentCategoryRepository;
|
||||||
|
|
||||||
|
private EntityManagerInterface $em;
|
||||||
|
|
||||||
|
private NormalizerInterface $normalizer;
|
||||||
|
|
||||||
|
private PersonRender $personRender;
|
||||||
|
|
||||||
|
private TranslatableStringHelperInterface $translatableStringHelper;
|
||||||
|
|
||||||
|
private TranslatorInterface $translator;
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
DocumentCategoryRepository $documentCategoryRepository,
|
||||||
|
NormalizerInterface $normalizer,
|
||||||
|
TranslatableStringHelperInterface $translatableStringHelper,
|
||||||
|
EntityManagerInterface $em,
|
||||||
|
PersonRender $personRender,
|
||||||
|
TranslatorInterface $translator,
|
||||||
|
BaseContextData $baseContextData
|
||||||
|
) {
|
||||||
|
$this->documentCategoryRepository = $documentCategoryRepository;
|
||||||
|
$this->normalizer = $normalizer;
|
||||||
|
$this->translatableStringHelper = $translatableStringHelper;
|
||||||
|
$this->em = $em;
|
||||||
|
$this->personRender = $personRender;
|
||||||
|
$this->translator = $translator;
|
||||||
|
$this->baseContextData = $baseContextData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function adminFormReverseTransform(array $data): array
|
||||||
|
{
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function adminFormTransform(array $data): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'mainPerson' => $data['mainPerson'] ?? false,
|
||||||
|
'mainPersonLabel' => $data['mainPersonLabel'] ?? $this->translator->trans('docgen.Main person'),
|
||||||
|
'person1' => $data['person1'] ?? false,
|
||||||
|
'person1Label' => $data['person1Label'] ?? $this->translator->trans('docgen.person 1'),
|
||||||
|
'person2' => $data['person2'] ?? false,
|
||||||
|
'person2Label' => $data['person2Label'] ?? $this->translator->trans('docgen.person 2'),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function buildAdminForm(FormBuilderInterface $builder): void
|
||||||
|
{
|
||||||
|
$builder
|
||||||
|
->add('mainPerson', CheckboxType::class, [
|
||||||
|
'required' => false,
|
||||||
|
'label' => 'docgen.Ask for main person',
|
||||||
|
])
|
||||||
|
->add('mainPersonLabel', TextType::class, [
|
||||||
|
'label' => 'main person label',
|
||||||
|
'required' => true,
|
||||||
|
])
|
||||||
|
->add('person1', CheckboxType::class, [
|
||||||
|
'required' => false,
|
||||||
|
'label' => 'docgen.Ask for person 1',
|
||||||
|
])
|
||||||
|
->add('person1Label', TextType::class, [
|
||||||
|
'label' => 'person 1 label',
|
||||||
|
'required' => true,
|
||||||
|
])
|
||||||
|
->add('person2', CheckboxType::class, [
|
||||||
|
'required' => false,
|
||||||
|
'label' => 'docgen.Ask for person 2',
|
||||||
|
])
|
||||||
|
->add('person2Label', TextType::class, [
|
||||||
|
'label' => 'person 2 label',
|
||||||
|
'required' => true,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Activity $entity
|
||||||
|
*/
|
||||||
|
public function buildPublicForm(FormBuilderInterface $builder, DocGeneratorTemplate $template, $entity): void
|
||||||
|
{
|
||||||
|
$options = $template->getOptions();
|
||||||
|
$persons = $entity->getPersons();
|
||||||
|
|
||||||
|
foreach (['mainPerson', 'person1', 'person2'] as $key) {
|
||||||
|
if ($options[$key] ?? false) {
|
||||||
|
$builder->add($key, EntityType::class, [
|
||||||
|
'class' => Person::class,
|
||||||
|
'choices' => $persons,
|
||||||
|
'choice_label' => function (Person $p) {
|
||||||
|
return $this->personRender->renderString($p, []);
|
||||||
|
},
|
||||||
|
'multiple' => false,
|
||||||
|
'expanded' => true,
|
||||||
|
'label' => $options[$key . 'Label'],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array
|
||||||
|
{
|
||||||
|
if (!$entity instanceof Activity) {
|
||||||
|
throw new UnexpectedTypeException($entity, Activity::class);
|
||||||
|
}
|
||||||
|
$options = $template->getOptions();
|
||||||
|
|
||||||
|
$data = [];
|
||||||
|
$data = array_merge($data, $this->baseContextData->getData());
|
||||||
|
$data['activity'] = $this->normalizer->normalize($entity, 'docgen', ['docgen:expects' => Activity::class, 'groups' => 'docgen:read']);
|
||||||
|
|
||||||
|
$data['course'] = $this->normalizer->normalize($entity->getAccompanyingPeriod(), 'docgen', ['docgen:expects' => AccompanyingPeriod::class, 'groups' => 'docgen:read']);
|
||||||
|
$data['person'] = $this->normalizer->normalize($entity->getPerson(), 'docgen', ['docgen:expects' => Person::class, 'groups' => 'docgen:read']);
|
||||||
|
|
||||||
|
foreach (['mainPerson', 'person1', 'person2'] as $k) {
|
||||||
|
if ($options[$k]) {
|
||||||
|
$data[$k] = $this->normalizer->normalize($contextGenerationData[$k], 'docgen', [
|
||||||
|
'docgen:expects' => Person::class,
|
||||||
|
'groups' => 'docgen:read',
|
||||||
|
'docgen:person:with-household' => true,
|
||||||
|
'docgen:person:with-relations' => true,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDescription(): string
|
||||||
|
{
|
||||||
|
return 'docgen.A basic context for activity';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getEntityClass(): string
|
||||||
|
{
|
||||||
|
return Activity::class;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFormData(DocGeneratorTemplate $template, $entity): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'activity' => $entity,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getKey(): string
|
||||||
|
{
|
||||||
|
return self::class;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getName(): string
|
||||||
|
{
|
||||||
|
return 'docgen.Activity basic';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hasAdminForm(): bool
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hasPublicForm(DocGeneratorTemplate $template, $entity): bool
|
||||||
|
{
|
||||||
|
$options = $template->getOptions();
|
||||||
|
|
||||||
|
return $options['mainPerson'] || $options['person1'] || $options['person2'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Activity $entity
|
||||||
|
*/
|
||||||
|
public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void
|
||||||
|
{
|
||||||
|
$entity->addDocument($storedObject);
|
||||||
|
|
||||||
|
$this->em->persist($storedObject);
|
||||||
|
}
|
||||||
|
}
|
@@ -66,7 +66,7 @@ final class ActivityReasonCategoryControllerTest extends WebTestCase
|
|||||||
$crawler = $client->followRedirect();
|
$crawler = $client->followRedirect();
|
||||||
|
|
||||||
// Check the entity has been delete on the list
|
// Check the entity has been delete on the list
|
||||||
$this->assertNotRegExp('/Foo/', $client->getResponse()->getContent());
|
$this->assertDoesNotMatchRegularExpression('/Foo/', $client->getResponse()->getContent());
|
||||||
}
|
}
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
@@ -66,7 +66,7 @@ final class ActivityReasonControllerTest extends WebTestCase
|
|||||||
$crawler = $client->followRedirect();
|
$crawler = $client->followRedirect();
|
||||||
|
|
||||||
// Check the entity has been delete on the list
|
// Check the entity has been delete on the list
|
||||||
$this->assertNotRegExp('/Foo/', $client->getResponse()->getContent());
|
$this->assertDoesNotMatchRegularExpression('/Foo/', $client->getResponse()->getContent());
|
||||||
}
|
}
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
@@ -66,7 +66,7 @@ final class ActivityTypeControllerTest extends WebTestCase
|
|||||||
$crawler = $client->followRedirect();
|
$crawler = $client->followRedirect();
|
||||||
|
|
||||||
// Check the entity has been delete on the list
|
// Check the entity has been delete on the list
|
||||||
$this->assertNotRegExp('/Foo/', $client->getResponse()->getContent());
|
$this->assertDoesNotMatchRegularExpression('/Foo/', $client->getResponse()->getContent());
|
||||||
}
|
}
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Chill\ActivityBundle\Tests\Aggregator;
|
namespace Chill\ActivityBundle\Tests\Export\Aggregator;
|
||||||
|
|
||||||
use Chill\MainBundle\Test\Export\AbstractAggregatorTest;
|
use Chill\MainBundle\Test\Export\AbstractAggregatorTest;
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@ final class ActivityReasonAggregatorTest extends AbstractAggregatorTest
|
|||||||
*/
|
*/
|
||||||
private $aggregator;
|
private $aggregator;
|
||||||
|
|
||||||
public function setUp()
|
protected function setUp(): void
|
||||||
{
|
{
|
||||||
self::bootKernel();
|
self::bootKernel();
|
||||||
|
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Chill\ActivityBundle\Tests\Aggregator;
|
namespace Chill\ActivityBundle\Tests\Export\Aggregator;
|
||||||
|
|
||||||
use Chill\MainBundle\Test\Export\AbstractAggregatorTest;
|
use Chill\MainBundle\Test\Export\AbstractAggregatorTest;
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@ final class ActivityTypeAggregatorTest extends AbstractAggregatorTest
|
|||||||
*/
|
*/
|
||||||
private $aggregator;
|
private $aggregator;
|
||||||
|
|
||||||
public function setUp()
|
protected function setUp(): void
|
||||||
{
|
{
|
||||||
self::bootKernel();
|
self::bootKernel();
|
||||||
|
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Chill\ActivityBundle\Tests\Aggregator;
|
namespace Chill\ActivityBundle\Tests\Export\Aggregator;
|
||||||
|
|
||||||
use Chill\MainBundle\Test\Export\AbstractAggregatorTest;
|
use Chill\MainBundle\Test\Export\AbstractAggregatorTest;
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@ final class ActivityUserAggregatorTest extends AbstractAggregatorTest
|
|||||||
*/
|
*/
|
||||||
private $aggregator;
|
private $aggregator;
|
||||||
|
|
||||||
public function setUp()
|
protected function setUp(): void
|
||||||
{
|
{
|
||||||
self::bootKernel();
|
self::bootKernel();
|
||||||
|
|
||||||
|
@@ -24,7 +24,7 @@ final class CountActivityTest extends AbstractExportTest
|
|||||||
*/
|
*/
|
||||||
private $export;
|
private $export;
|
||||||
|
|
||||||
public function setUp()
|
protected function setUp(): void
|
||||||
{
|
{
|
||||||
self::bootKernel();
|
self::bootKernel();
|
||||||
|
|
||||||
|
@@ -24,7 +24,7 @@ final class ListActivityTest extends AbstractExportTest
|
|||||||
*/
|
*/
|
||||||
private $export;
|
private $export;
|
||||||
|
|
||||||
public function setUp()
|
protected function setUp(): void
|
||||||
{
|
{
|
||||||
self::bootKernel();
|
self::bootKernel();
|
||||||
|
|
||||||
|
@@ -26,7 +26,7 @@ final class StatActivityDurationSumTest extends AbstractExportTest
|
|||||||
*/
|
*/
|
||||||
private $export;
|
private $export;
|
||||||
|
|
||||||
public function setUp()
|
protected function setUp(): void
|
||||||
{
|
{
|
||||||
self::bootKernel();
|
self::bootKernel();
|
||||||
|
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Chill\ActivityBundle\Tests\Filter;
|
namespace Chill\ActivityBundle\Tests\Export\Filter;
|
||||||
|
|
||||||
use Chill\MainBundle\Test\Export\AbstractFilterTest;
|
use Chill\MainBundle\Test\Export\AbstractFilterTest;
|
||||||
use Doctrine\Common\Collections\ArrayCollection;
|
use Doctrine\Common\Collections\ArrayCollection;
|
||||||
@@ -25,7 +25,7 @@ final class ActivityReasonFilterTest extends AbstractFilterTest
|
|||||||
*/
|
*/
|
||||||
private $filter;
|
private $filter;
|
||||||
|
|
||||||
public function setUp()
|
protected function setUp(): void
|
||||||
{
|
{
|
||||||
self::bootKernel();
|
self::bootKernel();
|
||||||
|
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Chill\ActivityBundle\Tests\Filter;
|
namespace Chill\ActivityBundle\Tests\Export\Filter;
|
||||||
|
|
||||||
use Chill\MainBundle\Test\Export\AbstractFilterTest;
|
use Chill\MainBundle\Test\Export\AbstractFilterTest;
|
||||||
use DateTime;
|
use DateTime;
|
||||||
@@ -26,7 +26,7 @@ final class PersonHavingActivityBetweenDateFilterTest extends AbstractFilterTest
|
|||||||
*/
|
*/
|
||||||
private $filter;
|
private $filter;
|
||||||
|
|
||||||
public function setUp()
|
protected function setUp(): void
|
||||||
{
|
{
|
||||||
self::bootKernel();
|
self::bootKernel();
|
||||||
|
|
||||||
|
@@ -45,7 +45,7 @@ final class ActivityTypeTest extends KernelTestCase
|
|||||||
*/
|
*/
|
||||||
protected $user;
|
protected $user;
|
||||||
|
|
||||||
public function setUp()
|
protected function setUp(): void
|
||||||
{
|
{
|
||||||
self::bootKernel();
|
self::bootKernel();
|
||||||
|
|
||||||
|
@@ -29,7 +29,7 @@ final class TranslatableActivityReasonTest extends TypeTestCase
|
|||||||
*/
|
*/
|
||||||
private static $prophet;
|
private static $prophet;
|
||||||
|
|
||||||
public function setUp()
|
protected function setUp(): void
|
||||||
{
|
{
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
}
|
}
|
||||||
|
@@ -31,7 +31,7 @@ final class TranslatableActivityTypeTest extends KernelTestCase
|
|||||||
*/
|
*/
|
||||||
protected $container;
|
protected $container;
|
||||||
|
|
||||||
public function setUp()
|
protected function setUp(): void
|
||||||
{
|
{
|
||||||
self::bootKernel();
|
self::bootKernel();
|
||||||
|
|
||||||
|
@@ -29,9 +29,13 @@ use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
|
|||||||
final class ActivityVoterTest extends KernelTestCase
|
final class ActivityVoterTest extends KernelTestCase
|
||||||
{
|
{
|
||||||
use PrepareActivityTrait;
|
use PrepareActivityTrait;
|
||||||
|
|
||||||
use PrepareCenterTrait;
|
use PrepareCenterTrait;
|
||||||
|
|
||||||
use PreparePersonTrait;
|
use PreparePersonTrait;
|
||||||
|
|
||||||
use PrepareScopeTrait;
|
use PrepareScopeTrait;
|
||||||
|
|
||||||
use PrepareUserTrait;
|
use PrepareUserTrait;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -44,7 +48,7 @@ final class ActivityVoterTest extends KernelTestCase
|
|||||||
*/
|
*/
|
||||||
protected $voter;
|
protected $voter;
|
||||||
|
|
||||||
public function setUp()
|
protected function setUp(): void
|
||||||
{
|
{
|
||||||
self::bootKernel();
|
self::bootKernel();
|
||||||
$this->voter = self::$kernel->getContainer()
|
$this->voter = self::$kernel->getContainer()
|
||||||
|
@@ -24,6 +24,7 @@ use RuntimeException;
|
|||||||
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
|
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
|
||||||
use Symfony\Component\Security\Core\Role\Role;
|
use Symfony\Component\Security\Core\Role\Role;
|
||||||
use Symfony\Component\Security\Core\User\UserInterface;
|
use Symfony\Component\Security\Core\User\UserInterface;
|
||||||
|
|
||||||
use function implode;
|
use function implode;
|
||||||
use function in_array;
|
use function in_array;
|
||||||
use function strtr;
|
use function strtr;
|
||||||
|
@@ -17,6 +17,7 @@ use Symfony\Component\Validator\Constraint;
|
|||||||
use Symfony\Component\Validator\ConstraintValidator;
|
use Symfony\Component\Validator\ConstraintValidator;
|
||||||
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
|
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
|
||||||
use Symfony\Component\Validator\Exception\UnexpectedValueException;
|
use Symfony\Component\Validator\Exception\UnexpectedValueException;
|
||||||
|
|
||||||
use function array_merge;
|
use function array_merge;
|
||||||
use function count;
|
use function count;
|
||||||
|
|
||||||
|
@@ -32,3 +32,8 @@ services:
|
|||||||
autowire: true
|
autowire: true
|
||||||
autoconfigure: true
|
autoconfigure: true
|
||||||
resource: '../Validator/Constraints/'
|
resource: '../Validator/Constraints/'
|
||||||
|
|
||||||
|
Chill\ActivityBundle\Service\DocGenerator\:
|
||||||
|
autowire: true
|
||||||
|
autoconfigure: true
|
||||||
|
resource: '../Service/DocGenerator/'
|
||||||
|
@@ -0,0 +1,15 @@
|
|||||||
|
services:
|
||||||
|
Chill\ActivityBundle\EntityListener\ActivityEntityListener:
|
||||||
|
autowire: true
|
||||||
|
autoconfigure: true
|
||||||
|
tags:
|
||||||
|
-
|
||||||
|
name: 'doctrine.orm.entity_listener'
|
||||||
|
event: 'postPersist'
|
||||||
|
entity: 'Chill\ActivityBundle\Entity\Activity'
|
||||||
|
method: 'persistActionToCourse'
|
||||||
|
-
|
||||||
|
name: 'doctrine.orm.entity_listener'
|
||||||
|
event: 'postUpdate'
|
||||||
|
entity: 'Chill\ActivityBundle\Entity\Activity'
|
||||||
|
method: 'persistActionToCourse'
|
@@ -13,6 +13,7 @@ namespace Chill\Migrations\Activity;
|
|||||||
|
|
||||||
use Doctrine\DBAL\Schema\Schema;
|
use Doctrine\DBAL\Schema\Schema;
|
||||||
use Doctrine\Migrations\AbstractMigration;
|
use Doctrine\Migrations\AbstractMigration;
|
||||||
|
|
||||||
use function count;
|
use function count;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Chill\Migrations\Activity;
|
||||||
|
|
||||||
|
use Doctrine\DBAL\Schema\Schema;
|
||||||
|
use Doctrine\Migrations\AbstractMigration;
|
||||||
|
|
||||||
|
final class Version20211207152023 extends AbstractMigration
|
||||||
|
{
|
||||||
|
public function down(Schema $schema): void
|
||||||
|
{
|
||||||
|
$this->throwIrreversibleMigrationException('placevisible and placelabel could not be created');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDescription(): string
|
||||||
|
{
|
||||||
|
return 'DROP place visible and place label, which are replaced by location';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function up(Schema $schema): void
|
||||||
|
{
|
||||||
|
$this->addSql('ALTER TABLE activitytype DROP placevisible');
|
||||||
|
$this->addSql('ALTER TABLE activitytype DROP placelabel');
|
||||||
|
}
|
||||||
|
}
|
@@ -76,7 +76,7 @@ activity:
|
|||||||
Insert a document: Insérer un document
|
Insert a document: Insérer un document
|
||||||
Remove a document: Supprimer le document
|
Remove a document: Supprimer le document
|
||||||
comment: Commentaire
|
comment: Commentaire
|
||||||
|
No documents: Pas de documents
|
||||||
|
|
||||||
#timeline
|
#timeline
|
||||||
'%user% has done an %activity_type%': '%user% a effectué une activité de type "%activity_type%"'
|
'%user% has done an %activity_type%': '%user% a effectué une activité de type "%activity_type%"'
|
||||||
@@ -146,8 +146,8 @@ User visible: Visibilité du champ Utilisateur
|
|||||||
User label: Libellé du champ Utilisateur
|
User label: Libellé du champ Utilisateur
|
||||||
Date visible: Visibilité du champ Date
|
Date visible: Visibilité du champ Date
|
||||||
Date label: Libellé du champ Date
|
Date label: Libellé du champ Date
|
||||||
Place visible: Visibilité du champ Lieu
|
Location visible: Visibilité du champ Lieu
|
||||||
Place label: Libellé du champ Lieu
|
Location label: Libellé du champ Lieu
|
||||||
Third parties visible: Visibilité du champ Tiers
|
Third parties visible: Visibilité du champ Tiers
|
||||||
Third parties label: Libellé du champ Tiers
|
Third parties label: Libellé du champ Tiers
|
||||||
Duration time visible: Visibilité du champ Durée
|
Duration time visible: Visibilité du champ Durée
|
||||||
@@ -222,3 +222,13 @@ Aggregate by activity type: Aggréger par type d'activité
|
|||||||
Aggregate by activity reason: Aggréger par sujet de l'activité
|
Aggregate by activity reason: Aggréger par sujet de l'activité
|
||||||
|
|
||||||
Last activities: Les dernières activités
|
Last activities: Les dernières activités
|
||||||
|
|
||||||
|
See activity in accompanying course context: Voir l'activité dans le contexte du parcours d'accompagnement
|
||||||
|
|
||||||
|
You get notified of an activity which does not exists any more: Cette notification ne correspond pas à une activité valide.
|
||||||
|
you are not allowed to see it details: La notification fait référence à une activité à laquelle vous n'avez pas accès.
|
||||||
|
This is the minimal activity data: Activité n°
|
||||||
|
|
||||||
|
docgen:
|
||||||
|
Activity basic: Echange
|
||||||
|
A basic context for activity: Contexte pour les échanges
|
||||||
|
@@ -20,3 +20,4 @@ For this type of activity, you must add at least one social action: Pour ce type
|
|||||||
|
|
||||||
# admin
|
# admin
|
||||||
This parameter must be equal to social issue parameter: Ce paramètre doit être égal au paramètre "Visibilité du champs Problématiques sociales"
|
This parameter must be equal to social issue parameter: Ce paramètre doit être égal au paramètre "Visibilité du champs Problématiques sociales"
|
||||||
|
The socialActionsVisible value is not compatible with the socialIssuesVisible value: Cette valeur du paramètre "Visibilité du champs Actions sociales" n'est pas compatible avec la valeur du paramètre "Visibilité du champs Problématiques sociales"
|
@@ -32,6 +32,8 @@ final class AsideActivityController extends CRUDController
|
|||||||
{
|
{
|
||||||
$asideActivity = new AsideActivity();
|
$asideActivity = new AsideActivity();
|
||||||
|
|
||||||
|
$asideActivity->setAgent($this->getUser());
|
||||||
|
|
||||||
$duration = $request->query->get('duration', '300');
|
$duration = $request->query->get('duration', '300');
|
||||||
$duration = DateTime::createFromFormat('U', $duration);
|
$duration = DateTime::createFromFormat('U', $duration);
|
||||||
$asideActivity->setDuration($duration);
|
$asideActivity->setDuration($duration);
|
||||||
|
@@ -19,6 +19,7 @@ use DateTimeImmutable;
|
|||||||
use Doctrine\Bundle\FixturesBundle\Fixture;
|
use Doctrine\Bundle\FixturesBundle\Fixture;
|
||||||
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
|
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
|
||||||
use Doctrine\Persistence\ObjectManager;
|
use Doctrine\Persistence\ObjectManager;
|
||||||
|
|
||||||
use function random_int;
|
use function random_int;
|
||||||
|
|
||||||
class LoadAsideActivity extends Fixture implements DependentFixtureInterface
|
class LoadAsideActivity extends Fixture implements DependentFixtureInterface
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user