mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-11-29 07:04:34 +00:00
Compare commits
271 Commits
dutch-tran
...
testing-20
| Author | SHA1 | Date | |
|---|---|---|---|
|
cf36070c82
|
|||
|
8ee836eec3
|
|||
|
388030952b
|
|||
|
82a08f1e27
|
|||
|
925fbaed6d
|
|||
|
c407c3029f
|
|||
|
81b6ae193c
|
|||
|
51168ac3c4
|
|||
|
12ee091d09
|
|||
|
49607e431f
|
|||
|
ea4cbfe3b9
|
|||
|
9d00b8ae60
|
|||
|
00350b9efc
|
|||
|
9a50dad671
|
|||
|
4206d17345
|
|||
|
110a2e894f
|
|||
|
a0daf4428f
|
|||
|
f78b8cad9c
|
|||
|
6b0c85cdf0
|
|||
|
92b71af239
|
|||
| a0db7cd7e6 | |||
| 011b6a29e4 | |||
| 527dc971d7 | |||
|
43e5bc8337
|
|||
|
845e582c44
|
|||
|
f3e04bd2bf
|
|||
| 96e95dd8f1 | |||
|
c40e790425
|
|||
|
3a016aa12a
|
|||
|
be448c650e
|
|||
|
9f32b5ac48
|
|||
|
e89f5e4713
|
|||
|
e79d6d670b
|
|||
|
9adbde0308
|
|||
|
fe31cfd544
|
|||
|
e8bca6a502
|
|||
| b0918ddd09 | |||
| a368e68abb | |||
| 85b9784eef | |||
| 26fd16ab07 | |||
| 9a3fef862e | |||
| 2c01516f71 | |||
| 246546b313 | |||
| bfe658d4fd | |||
| 7ea6638c3a | |||
|
b04f0a9aa4
|
|||
|
ebdfa04843
|
|||
|
be213d5b5c
|
|||
|
4d1032c115
|
|||
|
e43dfc9a20
|
|||
|
b11684fb3b
|
|||
|
b8826c6c0f
|
|||
|
a996b05ead
|
|||
|
cfcecf1cdc
|
|||
|
b6985e0e5f
|
|||
|
6d76b94644
|
|||
|
ff6ec45575
|
|||
|
f3fd18e6fb
|
|||
|
c8851a8e8a
|
|||
|
abdfe49c33
|
|||
|
e933f3e781
|
|||
|
fb1c34f9c1
|
|||
|
d506409d93
|
|||
|
9be8a533ff
|
|||
|
b414b27ba9
|
|||
|
8521672660
|
|||
|
3f5ce5f841
|
|||
|
e1404bf16d
|
|||
|
65b7ed0755
|
|||
|
a74118e5d4
|
|||
|
828739edf5
|
|||
|
d0811c8118
|
|||
|
176bff0551
|
|||
|
66c089e862
|
|||
|
aa44577484
|
|||
|
8c59cbc6a0
|
|||
|
8c5a7ac3e1
|
|||
|
a6e523ee0a
|
|||
|
d49058805a
|
|||
|
73496e0e1f
|
|||
|
973450110b
|
|||
|
0f6b10aa0a
|
|||
|
edeb8edbea
|
|||
|
fc8e3789e0
|
|||
|
52a80f9621
|
|||
|
5632697c05
|
|||
|
75932b0e29
|
|||
|
7e2bf91e09
|
|||
|
0581b59dbd
|
|||
|
4661ba9932
|
|||
|
f85b0c8cf7
|
|||
|
e701e96187
|
|||
|
d9d151aa89
|
|||
|
a14ed78e25
|
|||
|
420dd4f868
|
|||
|
3d9b9ea672
|
|||
|
9f12b42961
|
|||
|
2842548c17
|
|||
|
35f5501489
|
|||
|
5e2d960a19
|
|||
|
4129283a58
|
|||
|
f807d62dab
|
|||
|
5a7bba83f7
|
|||
|
50c75dff1a
|
|||
|
e37f3e7c37
|
|||
|
b6375cad6c
|
|||
|
8516c87a14
|
|||
|
8c5abbff74
|
|||
|
e0f94ae900
|
|||
|
f683e45b6e
|
|||
|
b1b7fb6401
|
|||
|
8fa06e143d
|
|||
|
ec3d901d2f
|
|||
|
f12d689382
|
|||
|
1c04219859
|
|||
|
2b88593e64
|
|||
|
ee65c46d2a
|
|||
|
7c239eaf6a
|
|||
|
694b1f3c1f
|
|||
|
80b9ce3c3e
|
|||
|
3f218e7183
|
|||
|
a2713041da
|
|||
|
3a904e8ea1
|
|||
|
6f1a26742d
|
|||
|
0d0a626f50
|
|||
|
ec5f4ed1d6
|
|||
|
d9251239f7
|
|||
|
b2d3d806b6
|
|||
|
8e952cc966
|
|||
|
1c4ee37507
|
|||
|
8331a836f2
|
|||
|
2482dcc62e
|
|||
|
f9a55a1bfd
|
|||
|
15aa565caf
|
|||
|
566b72ec9e
|
|||
|
bb42ee25ff
|
|||
|
aebeca1d7a
|
|||
|
1955249a60
|
|||
|
3b0a4e9c73
|
|||
|
b5fd9cf4af
|
|||
|
bb30ddc876
|
|||
|
5ebb53173e
|
|||
|
d1d6a00ebf
|
|||
|
e48bec490c
|
|||
|
128d365a72
|
|||
|
10f66afdcd
|
|||
|
89aed74355
|
|||
| b3bf405c5b | |||
|
9124fa68e8
|
|||
|
68b61b7d8a
|
|||
|
80d8f967fa
|
|||
|
1375a41de2
|
|||
| 4fa4d3b65c | |||
| bd4c34cc1d | |||
| 4cea678e93 | |||
| 5e6833975b | |||
| f523b9adb3 | |||
| a211549432 | |||
| 17b1363113 | |||
| 3356ed8e57 | |||
| 2a7fa517ee | |||
| 95972399a1 | |||
| 85781c8e14 | |||
| 00eb435896 | |||
| ed71cffd6a | |||
| ae679e6997 | |||
| e1d308fd97 | |||
| d9acda67e3 | |||
| e88da74882 | |||
| 591c44d1a0 | |||
| bf04b7981c | |||
| df33eec30f | |||
| c657c98918 | |||
| ef5eb5b907 | |||
| d683fe002d | |||
| 555bbca59b | |||
| e9e9d5c458 | |||
| b1842a33ae | |||
| 6afeaccf24 | |||
| fb76bac480 | |||
| 6ded185289 | |||
| 95adc29f9d | |||
| 4d0c3e683f | |||
| 018aafc773 | |||
| c4aea4efc2 | |||
| 225e3ca13f | |||
| 8c1fa7956a | |||
| e253d1b276 | |||
| a52aac2d98 | |||
| 9e8cf60dd8 | |||
| 7682d81d50 | |||
| 5d31ce96c1 | |||
| 81ef64a246 | |||
| 49d1f78001 | |||
| 0d0f3528e2 | |||
| d97d5e689a | |||
| 95d80ce13e | |||
| 668720984d | |||
| 245c3fa121 | |||
| 1af3e4c7ec | |||
| 5d0fc7a189 | |||
| 483d50e776 | |||
| b4c6ccf309 | |||
| ac6a81cbd8 | |||
| 9503cb89b6 | |||
| b130dbdcdc | |||
| b2b1865837 | |||
| ec5c4d51b3 | |||
|
180437f637
|
|||
|
0c2508d26d
|
|||
|
b2d8d21f04
|
|||
|
6a2aa77ecc
|
|||
|
e7cd9e00f9
|
|||
|
39f60b5b34
|
|||
|
c9c29b9105
|
|||
|
fb806a9579
|
|||
|
70ca4acafb
|
|||
|
bd61eedfbb
|
|||
|
80ce7f0bf1
|
|||
|
1ebf838bde
|
|||
|
85a9c6bb67
|
|||
|
db073fc920
|
|||
|
46ebfca28f
|
|||
|
22a2605381
|
|||
|
4f6a7116a4
|
|||
|
cac7d33a44
|
|||
|
0609e3f4c3
|
|||
|
3a738179f2
|
|||
|
a789bf5e1c
|
|||
|
0a21fada42
|
|||
|
4f030eb11a
|
|||
|
0d2a487ae7
|
|||
|
6cb23344fc
|
|||
|
da0d7a3b9e
|
|||
|
fcc61aa4c0
|
|||
|
21ec96b75c
|
|||
|
93f934152f
|
|||
|
49f4cce72a
|
|||
|
e69b679938
|
|||
|
229f9b7125
|
|||
|
4fc433cd63
|
|||
|
2c91d2e10f
|
|||
| 4302506471 | |||
| 09b7558e92 | |||
| 6ba5c91ee6 | |||
| 535409e529 | |||
| 9979378e78 | |||
| 58291c7402 | |||
| 3d397c0145 | |||
| d84f3ee5ad | |||
| 6db16e6d0b | |||
| ed60c6aaa3 | |||
| 13b1d20ade | |||
| 5999c73c98 | |||
| 580366de6d | |||
| 7f69f21b64 | |||
| 683a0bc4e9 | |||
| 4d6d40629f | |||
| 2185791665 | |||
| bf14c92567 | |||
| 7c1c1ed800 | |||
| 3b3659f13f | |||
| ebfdc57fcf | |||
| a562690512 | |||
|
1751c65731
|
|||
|
791f5bb4be
|
|||
|
2c812fc5fe
|
|||
|
1f1d38acef
|
|||
|
057c34610d
|
|||
|
732b7dc8f7
|
|||
|
cb068cdee7
|
6
.changes/unreleased/DX-20250401-144728.yaml
Normal file
6
.changes/unreleased/DX-20250401-144728.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
kind: DX
|
||||
body: Allow TranslatableMessage in flash messages
|
||||
time: 2025-04-01T14:47:28.814268801+02:00
|
||||
custom:
|
||||
Issue: ""
|
||||
SchemaChange: No schema change
|
||||
44
.changes/unreleased/DX-20250407-121010.yaml
Normal file
44
.changes/unreleased/DX-20250407-121010.yaml
Normal file
@@ -0,0 +1,44 @@
|
||||
kind: DX
|
||||
body: |
|
||||
Rewrite exports to run them asynchronously
|
||||
|
||||
changelog: |
|
||||
- Add new methods to serialize data using the rector rule
|
||||
- Remove all references to the Request in filters, aggregators, filters. Actually, the most frequent occurence is `$security->getUser()`.
|
||||
- Refactor manually the initializeQuery method
|
||||
- Remove the injection of ExportManager into the constructor of each export element:
|
||||
|
||||
```diff
|
||||
|
||||
- class MyFormatter implements FormatterInterface
|
||||
+ class MyFormatter implements FormatterInterface, \Chill\MainBundle\Export\ExportManagerAwareInterface
|
||||
{
|
||||
+ use \Chill\MainBundle\Export\Helper\ExportManagerAwareTrait;
|
||||
|
||||
- public function __construct(private ExportManager $exportmanager) {}
|
||||
|
||||
public function MyMethod(): void
|
||||
{
|
||||
- $this->exportManager->getFilter('alias');
|
||||
+ $this->getExportManager()->getFilter('alias');
|
||||
}
|
||||
}
|
||||
```
|
||||
- configure messenger to handle export in a queue:
|
||||
|
||||
```diff
|
||||
# config/packages/messenger.yaml
|
||||
framework:
|
||||
messenger:
|
||||
routing:
|
||||
+ 'Chill\MainBundle\Export\Messenger\ExportRequestGenerationMessage': priority
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
time: 2025-04-07T12:10:10.682561327+02:00
|
||||
custom:
|
||||
Issue: ""
|
||||
SchemaChange: Add columns or tables
|
||||
6
.changes/unreleased/DX-20250430-144550.yaml
Normal file
6
.changes/unreleased/DX-20250430-144550.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
kind: DX
|
||||
body: Remove dead code for wopi-link module
|
||||
time: 2025-04-30T14:45:50.406111606+02:00
|
||||
custom:
|
||||
Issue: "352"
|
||||
SchemaChange: No schema change
|
||||
6
.changes/unreleased/DX-20250528-165813.yaml
Normal file
6
.changes/unreleased/DX-20250528-165813.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
kind: DX
|
||||
body: Replace library node-sass by sass, and upgrade bootstrap to version 5.3 (yarn upgrade / install is required)
|
||||
time: 2025-05-28T16:58:13.226870341+02:00
|
||||
custom:
|
||||
Issue: ""
|
||||
SchemaChange: No schema change
|
||||
6
.changes/unreleased/Feature-20250211-142243.yaml
Normal file
6
.changes/unreleased/Feature-20250211-142243.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
kind: Feature
|
||||
body: Allow the merge of two accompanying period works
|
||||
time: 2025-02-11T14:22:43.134106669+01:00
|
||||
custom:
|
||||
Issue: "359"
|
||||
SchemaChange: No schema change
|
||||
7
.changes/unreleased/Feature-20250424-142211.yaml
Normal file
7
.changes/unreleased/Feature-20250424-142211.yaml
Normal file
@@ -0,0 +1,7 @@
|
||||
kind: Feature
|
||||
body: Add the document file name to the document title when a user upload a document,
|
||||
unless there is already a document title.
|
||||
time: 2025-04-24T14:22:11.800975422+02:00
|
||||
custom:
|
||||
Issue: "377"
|
||||
SchemaChange: No schema change
|
||||
6
.changes/unreleased/Feature-20250520-095628.yaml
Normal file
6
.changes/unreleased/Feature-20250520-095628.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
kind: Feature
|
||||
body: Add desactivation date for social action and issue csv export
|
||||
time: 2025-05-20T09:56:28.108941934+02:00
|
||||
custom:
|
||||
Issue: ""
|
||||
SchemaChange: No schema change
|
||||
6
.changes/unreleased/Feature-20250523-133341.yaml
Normal file
6
.changes/unreleased/Feature-20250523-133341.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
kind: Feature
|
||||
body: Add Emoji and Fullscreen feature to ckeditor configuration
|
||||
time: 2025-05-23T13:33:41.645095128+02:00
|
||||
custom:
|
||||
Issue: ""
|
||||
SchemaChange: No schema change
|
||||
6
.changes/unreleased/Feature-20250523-133434.yaml
Normal file
6
.changes/unreleased/Feature-20250523-133434.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
kind: Feature
|
||||
body: Create editor which allow us to toggle between rich and simple text editor
|
||||
time: 2025-05-23T13:34:34.56795603+02:00
|
||||
custom:
|
||||
Issue: "321"
|
||||
SchemaChange: No schema change
|
||||
7
.changes/unreleased/Fixed-20250424-133943.yaml
Normal file
7
.changes/unreleased/Fixed-20250424-133943.yaml
Normal file
@@ -0,0 +1,7 @@
|
||||
kind: Fixed
|
||||
body: trying to prevent bug of typeerror in doc-history + improved display of document
|
||||
history
|
||||
time: 2025-04-24T13:39:43.878468232+02:00
|
||||
custom:
|
||||
Issue: "376"
|
||||
SchemaChange: No schema change
|
||||
7
.changes/unreleased/Fixed-20250424-163746.yaml
Normal file
7
.changes/unreleased/Fixed-20250424-163746.yaml
Normal file
@@ -0,0 +1,7 @@
|
||||
kind: Fixed
|
||||
body: Display previous participation in acc course work even if the person has left
|
||||
the acc course
|
||||
time: 2025-04-24T16:37:46.970203594+02:00
|
||||
custom:
|
||||
Issue: "381"
|
||||
SchemaChange: No schema change
|
||||
6
.changes/unreleased/Fixed-20250505-102715.yaml
Normal file
6
.changes/unreleased/Fixed-20250505-102715.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
kind: Fixed
|
||||
body: Fix display of text in calendar events
|
||||
time: 2025-05-05T10:27:15.461493066+02:00
|
||||
custom:
|
||||
Issue: "372"
|
||||
SchemaChange: No schema change
|
||||
6
.changes/unreleased/Fixed-20250514-145339.yaml
Normal file
6
.changes/unreleased/Fixed-20250514-145339.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
kind: Fixed
|
||||
body: Add missing translation for user_group.no_user_groups
|
||||
time: 2025-05-14T14:53:39.53927329+02:00
|
||||
custom:
|
||||
Issue: ""
|
||||
SchemaChange: No schema change
|
||||
6
.changes/unreleased/Fixed-20250520-140008.yaml
Normal file
6
.changes/unreleased/Fixed-20250520-140008.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
kind: Fixed
|
||||
body: Fix retrieve schema to form full tablename and construct sql statements correctly in Thirdparty merger.
|
||||
time: 2025-05-20T14:00:08.987229634+02:00
|
||||
custom:
|
||||
Issue: ""
|
||||
SchemaChange: No schema change
|
||||
6
.changes/unreleased/Fixed-20250520-140433.yaml
Normal file
6
.changes/unreleased/Fixed-20250520-140433.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
kind: Fixed
|
||||
body: Fix add missing translation
|
||||
time: 2025-05-20T14:04:33.612140549+02:00
|
||||
custom:
|
||||
Issue: ""
|
||||
SchemaChange: No schema change
|
||||
6
.changes/unreleased/Fixed-20250520-164429.yaml
Normal file
6
.changes/unreleased/Fixed-20250520-164429.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
kind: Fixed
|
||||
body: Fix the transfer of evaluations and documents during of accompanyingperiodwork
|
||||
time: 2025-05-20T16:44:29.093304653+02:00
|
||||
custom:
|
||||
Issue: ""
|
||||
SchemaChange: No schema change
|
||||
@@ -1,7 +0,0 @@
|
||||
kind: Fixed
|
||||
body: |
|
||||
Associate activity's creator as a participant by default, and retro-actively append the creator to each activity
|
||||
time: 2025-11-18T14:05:59.904993123+01:00
|
||||
custom:
|
||||
Issue: "466"
|
||||
SchemaChange: Add columns or tables
|
||||
6
.changes/unreleased/UX-20250423-172624.yaml
Normal file
6
.changes/unreleased/UX-20250423-172624.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
kind: UX
|
||||
body: Remove default filter in_progress for the page 'my tasks'; Allows for new tasks to be displayed upon opening of the page
|
||||
time: 2025-04-23T17:26:24.45777387+02:00
|
||||
custom:
|
||||
Issue: "374"
|
||||
SchemaChange: No schema change
|
||||
@@ -1,6 +0,0 @@
|
||||
kind: UX
|
||||
body: Alphabetically order userJobs and mainLocations within user creation form
|
||||
time: 2025-11-19T15:37:06.393470745+01:00
|
||||
custom:
|
||||
Issue: "470"
|
||||
SchemaChange: No schema change
|
||||
@@ -1,6 +0,0 @@
|
||||
kind: UX
|
||||
body: Change position and color of confirm parcours button
|
||||
time: 2025-11-24T15:11:15.960279853+01:00
|
||||
custom:
|
||||
Issue: "437"
|
||||
SchemaChange: No schema change
|
||||
@@ -1,22 +0,0 @@
|
||||
## v3.12.0 - 2025-06-30
|
||||
### Feature
|
||||
* ([#377](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/377)) Add the document file name to the document title when a user upload a document, unless there is already a document title.
|
||||
* Add desactivation date for social action and issue csv export
|
||||
* Add Emoji and Fullscreen feature to ckeditor configuration
|
||||
* ([#321](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/321)) Create editor which allow us to toggle between rich and simple text editor
|
||||
* Do not remove workflow which are automatically canceled after staling for more than 30 days
|
||||
### Fixed
|
||||
* ([#376](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/376)) trying to prevent bug of typeerror in doc-history + improved display of document history
|
||||
* ([#381](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/381)) Display previous participation in acc course work even if the person has left the acc course
|
||||
* ([#372](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/372)) Fix display of text in calendar events
|
||||
* Add missing translation for user_group.no_user_groups
|
||||
* Fix admin entity edit actions for event admin entities and activity reason (category) entities
|
||||
* ([#392](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/392)) Allow null and cast as string to setContent method for NewsItem
|
||||
|
||||
* ([#393](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/393)) Doc Generation: the "dump only" method send the document as an email attachment.
|
||||
### DX
|
||||
* ([#352](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/352)) Remove dead code for wopi-link module
|
||||
* Replace library node-sass by sass, and upgrade bootstrap to version 5.3 (yarn upgrade / install is required)
|
||||
### UX
|
||||
* ([#374](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/374)) Remove default filter in_progress for the page 'my tasks'; Allows for new tasks to be displayed upon opening of the page
|
||||
* Improve labeling of fields in person resource creation form
|
||||
@@ -1,3 +0,0 @@
|
||||
## v3.12.1 - 2025-06-30
|
||||
### Fixed
|
||||
* Fix loading of the list of documents
|
||||
@@ -1,74 +0,0 @@
|
||||
## v4.0.0 - 2025-07-08
|
||||
### Feature
|
||||
* ([#359](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/359)) Allow the merge of two accompanying period works
|
||||
### Fixed
|
||||
* ([#390](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/390)) Display the list of participant in the results, even if there is only one participant and that the search result display the requestor
|
||||
* Fix admin entity edit actions for event admin entities and activity reason (category) entities
|
||||
* Fix translations for social action fields in admin form: results, goals, evaluations
|
||||
### DX
|
||||
* Rewrite exports to run them asynchronously
|
||||
|
||||
**Schema Change**: Add columns or tables
|
||||
* Allow TranslatableMessage in flash messages
|
||||
### UX
|
||||
* Improve labeling of fields in person resource creation form
|
||||
|
||||
|
||||
**Release notes**
|
||||
|
||||
- Add new methods to serialize data using the rector rule
|
||||
- Remove all references to the Request in filters, aggregators, filters. Actually, the most frequent occurence is `$security->getUser()`.
|
||||
- Refactor manually the initializeQuery method
|
||||
- Remove the injection of ExportManager into the constructor of each export element:
|
||||
|
||||
```diff
|
||||
|
||||
- class MyFormatter implements FormatterInterface
|
||||
+ class MyFormatter implements FormatterInterface, \Chill\MainBundle\Export\ExportManagerAwareInterface
|
||||
{
|
||||
+ use \Chill\MainBundle\Export\Helper\ExportManagerAwareTrait;
|
||||
|
||||
- public function __construct(private ExportManager $exportmanager) {}
|
||||
|
||||
public function MyMethod(): void
|
||||
{
|
||||
- $this->exportManager->getFilter('alias');
|
||||
+ $this->getExportManager()->getFilter('alias');
|
||||
}
|
||||
}
|
||||
```
|
||||
- configure messenger to handle export in a queue:
|
||||
|
||||
```diff
|
||||
# config/packages/messenger.yaml
|
||||
framework:
|
||||
messenger:
|
||||
routing:
|
||||
+ 'Chill\MainBundle\Export\Messenger\ExportRequestGenerationMessage': priority
|
||||
```
|
||||
|
||||
- add missing methods to exports, aggregators, filters, formatter:
|
||||
|
||||
```php
|
||||
public function normalizeFormData(array $formData): array;
|
||||
|
||||
public function denormalizeFormData(array $formData, int $fromVersion): array;
|
||||
```
|
||||
|
||||
There are rector rules to generate those methods:
|
||||
|
||||
- `Chill\Utils\Rector\Rector\ChillBundleAddNormalizationMethodsOnExportRector`
|
||||
|
||||
See:
|
||||
|
||||
```php
|
||||
// upgrade chill exports
|
||||
$rectorConfig->rules([\Chill\Utils\Rector\Rector\ChillBundleAddNormalizationMethodsOnExportRector::class]);
|
||||
```
|
||||
|
||||
This rule will create most of the work necessary, but some manuals changes are still necessary:
|
||||
|
||||
- we must set manually the correct repository for method `denormalizeDoctrineEntity`;
|
||||
- when the form data contains some entities, and the form type is not one of EntityType::class, PickUserDynamicType::class, PickUserLocationType::class, PickThirdpartyDynamicType::class, Select2CountryType::class, then we must handle the normalization manually (using the `\Chill\MainBundle\Export\ExportDataNormalizerTrait`)
|
||||
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
## v4.0.1 - 2025-07-08
|
||||
### Fixed
|
||||
* Fix package.json for compilation
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
## v4.0.2 - 2025-07-09
|
||||
### Fixed
|
||||
* Fix add missing translation
|
||||
* Fix the transfer of evaluations and documents during of accompanyingperiodwork
|
||||
@@ -1,12 +0,0 @@
|
||||
## v4.1.0 - 2025-08-26
|
||||
### Feature
|
||||
* ([#400](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/400)) Add filter to social actions list to filter out actions where current user intervenes
|
||||
* ([#399](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/399)) Show filters on list pages unfolded by default
|
||||
* Expansion of event module with new fields in the creation form: thematic, internal/external animator, responsable, and budget elements. Filtering options in the event list + adapted exports
|
||||
|
||||
**Schema Change**: Add columns or tables
|
||||
### Fixed
|
||||
* ([#382](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/382)) adjust display logic for accompanying period dates, include closing date if period is closed.
|
||||
* ([#384](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/384)) add min and step attributes to integer field in DateIntervalType
|
||||
### UX
|
||||
* Limit display of participations in event list
|
||||
@@ -1,10 +0,0 @@
|
||||
## v4.2.0 - 2025-09-02
|
||||
### Feature
|
||||
* ([#64](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/64)) Add external identifier for a Person
|
||||
|
||||
**Schema Change**: Add columns or tables
|
||||
* ([#330](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/330) Allow users to choose for which notifications they want to receive an email
|
||||
### Fixed
|
||||
* ([#422](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/422)) Fixed html layout of pages for recovering password
|
||||
* Fix typo in 'uncheckAll' script for centers selection
|
||||
* Fix incorrect parameter name in event details link
|
||||
@@ -1,6 +0,0 @@
|
||||
## v4.2.1 - 2025-09-03
|
||||
### Fixed
|
||||
* Fix exports to work with DirectExportInterface
|
||||
### DX
|
||||
* Improve error message when a stored object cannot be written on local disk
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
## v4.3.0 - 2025-09-08
|
||||
### Feature
|
||||
* ([#409](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/409)) Add 45 and 60 min calendar ranges
|
||||
* Add a command to generate a list of permissions
|
||||
* ([#412](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/412)) Add an absence end date
|
||||
|
||||
**Schema Change**: Add columns or tables
|
||||
### Fixed
|
||||
* fix date formatting in calendar range display
|
||||
* Change route URL to avoid clash with person duplicate controller method
|
||||
@@ -1,8 +0,0 @@
|
||||
## v4.4.0 - 2025-09-11
|
||||
### Feature
|
||||
* ([#359](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/359)) Allow the merge of two accompanying period works
|
||||
* ([#369](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/369)) Duplication of a document to another accompanying period work evaluation
|
||||
* ([#359](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/359)) Fusion of two accompanying period works
|
||||
### Fixed
|
||||
* Fix display of 'duplicate' and 'merge' buttons in CRUD templates
|
||||
* Fix saving notification preferences in user's profile
|
||||
@@ -1,3 +0,0 @@
|
||||
## v4.4.1 - 2025-09-11
|
||||
### Fixed
|
||||
* fix translations in duplicate evaluation document modal and realign close modal button
|
||||
@@ -1,3 +0,0 @@
|
||||
## v4.4.2 - 2025-09-12
|
||||
### Fixed
|
||||
* Fix document generation and workflow generation do not work on accompanying period work documents
|
||||
@@ -1,13 +0,0 @@
|
||||
## v4.5.0 - 2025-10-03
|
||||
### Feature
|
||||
* Only allow delete of attachment on workflows that are not final
|
||||
* Move up signature buttons on index workflow page for easier access
|
||||
* Filter out document from attachment list if it is the same as the workflow document
|
||||
* Block edition on attached document on workflow, if the workflow is finalized or sent external
|
||||
* Convert workflow's attached document to pdf while sending them external
|
||||
* After a signature is canceled or rejected, going to a waiting page until the post-process routines apply a workflow transition
|
||||
### Fixed
|
||||
* ([#426](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/426)) Increased the number of required characters when setting a new password in Chill from 9 to 14 - GDPR compliance
|
||||
* Fix permissions on storedObject which are subject by a workflow
|
||||
### DX
|
||||
* Introduce a WaitingScreen component to display a waiting screen
|
||||
@@ -1,4 +0,0 @@
|
||||
## v4.5.1 - 2025-10-03
|
||||
### Fixed
|
||||
* Add missing javascript dependency
|
||||
* Add exception handling for conversion of attachment on sending external, when documens are already in pdf
|
||||
@@ -1,14 +0,0 @@
|
||||
## v4.6.0 - 2025-10-15
|
||||
### Feature
|
||||
* ([#423](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/423)) Create environment banner that can be activated and configured depending on the image deployed
|
||||
* ([#394](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/394)) Only show active workflow on the page "my tracked workflow"
|
||||
### Fixed
|
||||
* Fix loading of classLists in SocialIssuesAcc.vue, ensure elements are present
|
||||
* Fix the rendering of list of StoredObjectVersions, where there are kept version (before converting to pdf) and intermediate versions deleted
|
||||
* ([#434](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/434)) Notification: fix editing of sent notification by removing form.addressesEmails, a field that no longer exists
|
||||
* Fix loading of social issues and social actions within vue component
|
||||
* ([#446](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/446)) Add unique condition on stored object filename, with cleaning step on existing duplicate filenames
|
||||
|
||||
**Schema Change**: Drop or rename table or columns, or enforce new constraint that must be manually fixed
|
||||
* [workflow] take permissions into account to delete the workflow attachment
|
||||
* ([#448](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/448)) Fix the execution of daily cronjob notification, when the previous last execution storage was invalid
|
||||
@@ -1,3 +0,0 @@
|
||||
## v4.6.1 - 2025-10-27
|
||||
### Fixed
|
||||
* Fix export case where no 'reason' is picked within the PersonHavingActivityBetweenDateFilter.php
|
||||
@@ -1,21 +0,0 @@
|
||||
## v4.7.0 - 2025-11-10
|
||||
### Feature
|
||||
* ([#385](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/385)) Create invitation list in user menu
|
||||
* ([#404](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/404)) Add columns for comments linked to an activity in the activity list export
|
||||
### Fixed
|
||||
* ([#451](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/451)) Fix: display also social actions linked to parents of the selected social issue
|
||||
* ([#453](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/453)) Fix: export actions and their results in csv even when action does not have any goals attached to it.
|
||||
* Fix the possibility to delete a workflow
|
||||
|
||||
**Schema Change**: Drop or rename table or columns, or enforce new constraint that must be manually fixed
|
||||
* ([#457](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/457)) Fix the fusion of thirdparty properties that are located in another schema than public for TO_ONE relations + add extra loop for MANY_TO_MANY relations where thirdparty is the source instead of the target
|
||||
* ([#428](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/428)) Fix suggestion of referrer when creating notification for accompanyingPeriodWorkDocument
|
||||
### DX
|
||||
* Send notifications log to dedicated channel, if it exists
|
||||
|
||||
### UX
|
||||
* ([#425](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/425)) Change the terms 'cercle' and 'centre' to 'service', and 'territoire' respectively.
|
||||
* ([#542](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/542)) Improve the ux for selecting whether user wants to be notified of the final step of a workflow or all steps
|
||||
* Expand timeSpent choices for evaluation document and translate them to user locale or fallback 'fr'
|
||||
* ([#455](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/455)) Change the order of display for results and objectives in the social work/action form
|
||||
* Wrap text when it is too long within badges
|
||||
@@ -1,9 +0,0 @@
|
||||
## v4.8.0 - 2025-11-17
|
||||
### Feature
|
||||
* ([#461](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/461)) Make a calendar item on the 'mes rendez-vous' page clickable. Clicking will navigate to the edit page of the calendar item.
|
||||
### Fixed
|
||||
* ([#463](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/463)) Display calendar items for which an invite was accepted on the mes rendez-vous page
|
||||
* Improve accessibility on login page
|
||||
|
||||
### UX
|
||||
* ([#449](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/449)) Remove the label if there is only one scope and no scope picking field is displayed.
|
||||
@@ -1,6 +0,0 @@
|
||||
## v4.8.1 - 2025-11-20
|
||||
### Fixed
|
||||
* Insert name of file as the document title when uploading
|
||||
* Add missing path paramater 'id' for editing multiple participations
|
||||
* ([#471](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/471)) Hide the display of inactive user groups in the api
|
||||
|
||||
4
.env
4
.env
@@ -92,7 +92,3 @@ REDIS_URL=redis://${REDIS_HOST}:${REDIS_PORT}
|
||||
###> symfony/ovh-cloud-notifier ###
|
||||
# OVHCLOUD_DSN=ovhcloud://APPLICATION_KEY:APPLICATION_SECRET@default?consumer_key=CONSUMER_KEY&service_name=SERVICE_NAME
|
||||
###< symfony/ovh-cloud-notifier ###
|
||||
|
||||
###> symfony/loco-translation-provider ###
|
||||
#LOCO_DSN=loco://API_KEY@default
|
||||
###< symfony/loco-translation-provider ###
|
||||
|
||||
@@ -7,6 +7,14 @@
|
||||
"message": "'app' is assigned a value but never used.",
|
||||
"hash": "f8c2979921289906e3baabae31ba101ead91504f"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillActivityBundle/Resources/public/vuejs/Activity/index.js",
|
||||
"line": 57,
|
||||
"column": 23,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'event' is defined but never used.",
|
||||
"hash": "cf0cf378f71403f62a6425f384ccbbdec433d1f2"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillCalendarBundle/Resources/public/module/Invite/answer.js",
|
||||
"line": 7,
|
||||
@@ -119,6 +127,46 @@
|
||||
"message": "'payload' is defined but never used.",
|
||||
"hash": "66c545917093ba30f1d6ca10ddaa676140e749bd"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillCalendarBundle/Resources/public/vuejs/MyCalendarRange/App2.vue",
|
||||
"line": 224,
|
||||
"column": 10,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'reactive' is defined but never used.",
|
||||
"hash": "96ed76a9828138fb125fc36c4b55e900bbfe87c2"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillCalendarBundle/Resources/public/vuejs/MyCalendarRange/App2.vue",
|
||||
"line": 230,
|
||||
"column": 5,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'DropArg' is defined but never used.",
|
||||
"hash": "bd405399a4091d65e8391404bfb0c4611816c8e0"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillCalendarBundle/Resources/public/vuejs/MyCalendarRange/App2.vue",
|
||||
"line": 251,
|
||||
"column": 9,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'t' is assigned a value but never used.",
|
||||
"hash": "bc09207a496405f7a71c178e522b89aeb1f7ebd3"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillCalendarBundle/Resources/public/vuejs/MyCalendarRange/App2.vue",
|
||||
"line": 356,
|
||||
"column": 32,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'arg' is defined but never used.",
|
||||
"hash": "aeae152f0669b946a1ad681dd52b0ef03393ae79"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillCalendarBundle/Resources/public/vuejs/MyCalendarRange/App2.vue",
|
||||
"line": 434,
|
||||
"column": 11,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'changedEvent' is assigned a value but never used.",
|
||||
"hash": "a7a81a6bf09d00c0364e3aa8207ffad853f0547b"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillCalendarBundle/Resources/public/vuejs/MyCalendarRange/Components/EditLocation.vue",
|
||||
"line": 77,
|
||||
@@ -351,6 +399,14 @@
|
||||
"message": "'error' is defined but never used.",
|
||||
"hash": "e26e5e101e90d2b7ee84d6f5de8c819e52129c17"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillDocStoreBundle/Resources/public/module/async_upload/index.ts",
|
||||
"line": 29,
|
||||
"column": 14,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'vm' is defined but never used.",
|
||||
"hash": "8e7f5e89dd72c54459cf82156389b88988f97d63"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillDocStoreBundle/Resources/public/module/async_upload/uploader.js",
|
||||
"line": 39,
|
||||
@@ -559,6 +615,14 @@
|
||||
"message": "'ref' is defined but never used.",
|
||||
"hash": "2a27cd6d06a26e1326654c929068e3704137e24b"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/HistoryButton/HistoryButtonList.vue",
|
||||
"line": 57,
|
||||
"column": 17,
|
||||
"ruleId": "vue/valid-v-for",
|
||||
"message": "Custom elements in iteration require 'v-bind:key' directives.",
|
||||
"hash": "cce787939524e83dd135869e13738ef332d7156c"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/WopiEditButton.vue",
|
||||
"line": 15,
|
||||
@@ -919,6 +983,22 @@
|
||||
"message": "'_e' is defined but never used.",
|
||||
"hash": "1d6448401778e8c56554020fe5abd47851ed33f3"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/module/wopi-link/index.js",
|
||||
"line": 21,
|
||||
"column": 55,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'e' is defined but never used.",
|
||||
"hash": "eae499e4f6e9f43a9d17f9cd917cb6d3d97be25c"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/page/export/download-export.js",
|
||||
"line": 3,
|
||||
"column": 55,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'e' is defined but never used.",
|
||||
"hash": "088fd383e7807e484aefc9825209bc7c8942bd22"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/page/homepage_widget/index.js",
|
||||
"line": 9,
|
||||
@@ -1009,19 +1089,115 @@
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue",
|
||||
"line": 516,
|
||||
"column": 21,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"context\" prop.",
|
||||
"hash": "984c4203f2ac1e1bb65f9ce76ecd03b763cfaa83"
|
||||
"line": 247,
|
||||
"column": 5,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'postAddressToPerson' is defined but never used.",
|
||||
"hash": "8a41c437cf2b5554cbbe1704cd51f3102b3d5994"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue",
|
||||
"line": 517,
|
||||
"line": 248,
|
||||
"column": 5,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'postAddressToHousehold' is defined but never used.",
|
||||
"hash": "66dec84b2ece299daf21308e5e60d497ba442b27"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue",
|
||||
"line": 490,
|
||||
"column": 21,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"context\" prop.",
|
||||
"hash": "c9fb019bc21bfa77d989ed596913b99dd653c594"
|
||||
"hash": "0d3f40c47974a4371072b3b9ee04b197c830162d"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue",
|
||||
"line": 491,
|
||||
"column": 21,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"context\" prop.",
|
||||
"hash": "8e877b7e588c30e182f7b572bdb9685360f9cf99"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue",
|
||||
"line": 508,
|
||||
"column": 47,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'reject' is defined but never used.",
|
||||
"hash": "5a3e3401bc3c765d91faaf4cfde57697af1262b7"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue",
|
||||
"line": 525,
|
||||
"column": 47,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'reject' is defined but never used.",
|
||||
"hash": "35a741d90379574b9323279f5802193d0c98a9dc"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue",
|
||||
"line": 553,
|
||||
"column": 47,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'reject' is defined but never used.",
|
||||
"hash": "c23d1ddf6c0d10ae97948e74aee9c14b9320b86c"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue",
|
||||
"line": 572,
|
||||
"column": 47,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'reject' is defined but never used.",
|
||||
"hash": "4322e81c6ea9d9734c680633a724d5bd4fabacb2"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue",
|
||||
"line": 803,
|
||||
"column": 47,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'reject' is defined but never used.",
|
||||
"hash": "7928a6461b9d394c7d97f048933553936f7d8963"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue",
|
||||
"line": 852,
|
||||
"column": 47,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'reject' is defined but never used.",
|
||||
"hash": "e5afdb8efccb5470a08dde48f755b1268fa947b5"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressMore.vue",
|
||||
"line": 93,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "68f5e1cf5c03f9ada59c9e0afca0b74c7f3fca4b"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressMore.vue",
|
||||
"line": 101,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "50d730f6109092baff2db66adc44dc1315e2bda2"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressMore.vue",
|
||||
"line": 109,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "573e4c041ce663f28b933d7a675c2a525aba644c"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressMore.vue",
|
||||
"line": 117,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "293f845eeab515b1df4649d136c2d8219ed59c4d"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressMore.vue",
|
||||
@@ -1048,180 +1224,204 @@
|
||||
"hash": "2d5a5e680ff207ad97c7e7b7d999064b561dfd8a"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressMore.vue",
|
||||
"line": 149,
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
|
||||
"line": 106,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "e4c1ecd7ae77d46ac3625c5bbe92a24d6a964db9"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressMore.vue",
|
||||
"line": 157,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "4dece2db87c6ce1c04ae06c088ddfe916c1c0c61"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressMore.vue",
|
||||
"line": 165,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "facc7a0f17bdf19396fae3d0de3da82e60503c0d"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressMore.vue",
|
||||
"line": 173,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "19de32c76518387218264d7c4dab914d143a9cca"
|
||||
"hash": "d52356f2af31d0167c02330ec22d09fbfa6b2b9f"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
|
||||
"line": 130,
|
||||
"line": 114,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "239ac02a02694d5b20ab30d4c7ce5838c51d1515"
|
||||
"hash": "c8e8e06f370f93bf05867e93b5f037dfa46937b1"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
|
||||
"line": 138,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "a54f9bc6d1edfa4df93c7dd7d409cfef3fccf99e"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
|
||||
"line": 152,
|
||||
"line": 128,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "74a5f664d18f3916ea908897fcd0291cb0128f29"
|
||||
"hash": "9abaf71ca4b4f292b3b01e724d0a7733365e71f1"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
|
||||
"line": 129,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "0b0743959778a9e3d93089b132608816ee4e6646"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
|
||||
"line": 132,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "9759da7b7859b8ee8efaf74876430658ac6b6fe2"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
|
||||
"line": 133,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "dba8be9a27ab74ec743b7d9e07c05d857b407dd3"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
|
||||
"line": 134,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "9b1f5bce779aafc46b19d7a5d266eaa29f8f9be9"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
|
||||
"line": 139,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "fe6fc4aea0994ba9da15b7c09d308842b67958cb"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
|
||||
"line": 153,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "740ea5d793c7a34c9f352d8b333f3aa04cc80ee8"
|
||||
"column": 55,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'reject' is defined but never used.",
|
||||
"hash": "bd0e024fcad2e3f4566f15293e3c25c840f6dd3e"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
|
||||
"line": 156,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "af8aca18f0226a5988ed90d44d95e2d607bfb5e6"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
|
||||
"line": 157,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "7bc2453017793ae20cd6c10005f941d384b59d84"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
|
||||
"line": 158,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "571b4ee5f22358dd165ec59696bb3439b7c9ff6c"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
|
||||
"line": 163,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "cfcb5946c86e289fc61623a794284a5a272d02e8"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
|
||||
"line": 178,
|
||||
"line": 154,
|
||||
"column": 37,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "0ec402e43cb08bf129e0737c0d2c4f6d0c7af8bd"
|
||||
"hash": "596c4b180b926b7829f987384328bf5636cd367a"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
|
||||
"line": 196,
|
||||
"line": 171,
|
||||
"column": 59,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'reject' is defined but never used.",
|
||||
"hash": "5b41d5f9b45da074fb7bbbbd45e0da501da72071"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
|
||||
"line": 172,
|
||||
"column": 41,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "ec178d33e067aac892e015002afb6f3a2ff98762"
|
||||
"hash": "d92b92a25043244cca809bd129633b7e024e26b4"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
|
||||
"line": 214,
|
||||
"line": 190,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "c0f4e5454e672b6064eb9cf6c235c6810f7bfa80"
|
||||
"hash": "dd9a85ea740742d620e864796f67c5bff834486d"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
|
||||
"line": 215,
|
||||
"line": 191,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "e3dd840d2474f9865a45822872bf9ecfb15961d7"
|
||||
"hash": "e3e59960d0d50709a57b336f66b586710b774892"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
|
||||
"line": 216,
|
||||
"line": 192,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "a32a60382b145cc7a4a7ebe01ec435b8e3103320"
|
||||
"hash": "fe11b0e54396511e7b3b08615a78d22fc27e2fad"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
|
||||
"line": 246,
|
||||
"line": 222,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "082447e5c731012f3acc282943502775dfd24797"
|
||||
"hash": "63c14c2150c33ec701bc4a0ff94efde69537d490"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 118,
|
||||
"line": 96,
|
||||
"column": 20,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "d4fba4fe09af3c0937c0dd164928c8930c1591b5"
|
||||
"hash": "d2a9fdaeef0e2810f480022d4c6f99e4f76a818e"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 118,
|
||||
"line": 96,
|
||||
"column": 20,
|
||||
"ruleId": "vue/no-side-effects-in-computed-properties",
|
||||
"message": "Unexpected side effect in \"cities\" computed property.",
|
||||
"hash": "1113a114d5aaf9f32f442916d25458541c5af35c"
|
||||
"hash": "dd92a60a9b1ebefeb9a90941d45326fbfa483733"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 102,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "04be01ab638ce01f568fb0216929e65e1175ca23"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 110,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "8619c8e0b63e87d09268832f90e4fba06b87e41f"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 124,
|
||||
"column": 17,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "fa56a7c93583f0a9d0c2ecac10228c4f4fc1bc3a"
|
||||
"hash": "281f918da00635079501418b1e6b2c05b62eb4a7"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 132,
|
||||
"column": 17,
|
||||
"line": 125,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "9fe87937ea67d1dae95fb3d44d4be0da2eba0905"
|
||||
"hash": "c131b09fa67ab1d069f1d04a54582d6b0f206153"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 126,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "3d3a2a4add64c291b8f5f1cddd90a173cd6a819d"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 131,
|
||||
"column": 21,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "ed48f4988914d7897018a2e06830a97e6740b3e8"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 145,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "744f3a7610d4d6015e50e25149bceffd6c6e2763"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
@@ -1241,139 +1441,115 @@
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 148,
|
||||
"column": 13,
|
||||
"line": 149,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "ab4f478fbfbc954b8dff75176dcd432f9ff28cfc"
|
||||
"hash": "1e7b1ad55866f708baaca72dfa4ff26d6f8e5d21"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 153,
|
||||
"column": 21,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "1d907d149f9ddb62e32140a90efe9a74b3e71fef"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 167,
|
||||
"line": 152,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "8aa37d2d4f011773e68838a2c88017875de563b5"
|
||||
"hash": "84779331536ffceec8d4a8c5ca4307310b882549"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 168,
|
||||
"line": 161,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "a4827a357e52a51fa9262319114d81a130296acf"
|
||||
"hash": "0789999841be671a4d8ab080d6fdb679f843eb52"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 169,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "a4c9715664202949e3242b8d4aa4098288b46dc4"
|
||||
"line": 170,
|
||||
"column": 51,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'reject' is defined but never used.",
|
||||
"hash": "bbb17afa114f016e2058d90aa32d2a625804f0d1"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 171,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "f3e9e21e433e90ec7b615b8940d43c4177372b66"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 174,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "770b7a24cc24b380e88db47d62422c8e1ece2571"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 183,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "2aef3c519a9ec6abcfe7573989d3de19d5c4c752"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 193,
|
||||
"column": 33,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "5d1f97e4d7d9f47399d312e8b9f95ef9e3843b8c"
|
||||
"hash": "5fbe407ceceb37bff2ac800ceddd7942540132f1"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 190,
|
||||
"column": 55,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'reject' is defined but never used.",
|
||||
"hash": "e2af91def877befbabef8e93deba4c58a3ee2ded"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 191,
|
||||
"column": 37,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "ee8544ee45681a650ed7d4918ae979685cdd8f0f"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 210,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "5d9d2217c8c7e6571bc9f72a98ea5b370edb4968"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 211,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "6e04619b373c23c91f6c36c2aad314ac16cdb697"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 212,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "39df045639a62f64ccdb03a80e286bc3ad772587"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 213,
|
||||
"column": 37,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "c1df874f790ef0c036bf58ae8a8db1ee173685d4"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 232,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "476e6588a28ac9382e8b9d2e63a8babecd23bad8"
|
||||
"hash": "c399a43fa797a8ce61c9d96a644a39cc84a387b7"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 233,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "6a0c82ba72d6d87217bf33a6ad8e40a4b81bc802"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 234,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "741d5af6c7d90041c0dc1c1df2e8699b80fca69a"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 235,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "c3ffd141f58d532663875cc5c7d338ed00db2a6d"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
|
||||
"line": 267,
|
||||
"line": 245,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "2700f258396516a2fe971618fafbcdf72cdda3ab"
|
||||
"hash": "04337a07944caaa4819cfebcf29e1a7cbfdf248b"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CountrySelection.vue",
|
||||
"line": 94,
|
||||
"line": 76,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "4be1b0592efa775092a91a1d744e16ce98bd216e"
|
||||
"hash": "373a2e31f110d138c66d77f1faf5dc61545c55af"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CountrySelection.vue",
|
||||
"line": 99,
|
||||
"line": 81,
|
||||
"column": 13,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "19b54b6d76c30249d520a296f826eda9d6eb0668"
|
||||
"hash": "421eb6a63224b4b1d81b216677a710c5c99ddee3"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/DatePane.vue",
|
||||
@@ -1393,19 +1569,19 @@
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/EditPane.vue",
|
||||
"line": 169,
|
||||
"line": 155,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "dcb7b34098062760ddbb849655a5bb3ca65c36d3"
|
||||
"hash": "b3a822914fcb5e2fcf28efc331a45b9205002eeb"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/EditPane.vue",
|
||||
"line": 178,
|
||||
"line": 164,
|
||||
"column": 17,
|
||||
"ruleId": "vue/no-mutating-props",
|
||||
"message": "Unexpected mutation of \"entity\" prop.",
|
||||
"hash": "86b3ecf201025cac36878c5e4bf8850fb9d58cb5"
|
||||
"hash": "72c7d850f6cdeaf65b373a33234222f9766ee30b"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/index.js",
|
||||
@@ -1455,6 +1631,14 @@
|
||||
"message": "'app' is assigned a value but never used.",
|
||||
"hash": "9e6125f4fc387dc362c69cc6e3ce360eb2851f1b"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/PickEntity/PickEntity.vue",
|
||||
"line": 60,
|
||||
"column": 22,
|
||||
"ruleId": "vue/require-valid-default-prop",
|
||||
"message": "Type of the default value for 'suggested' prop must be a function.",
|
||||
"hash": "d30212820bc2e97fa02d75dbc3a014558693f169"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/_components/AddressDetails/Parts/AddressDetailsMap.vue",
|
||||
"line": 24,
|
||||
@@ -1543,6 +1727,14 @@
|
||||
"message": "'tags' is assigned a value but never used.",
|
||||
"hash": "ae9bb2e0651c118ed9efd227e88b86cc83f5d80d"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/StickyNav.vue",
|
||||
"line": 116,
|
||||
"column": 18,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'event' is defined but never used.",
|
||||
"hash": "201f182769c6dfb87148b841e7d9b592be429669"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/index.js",
|
||||
"line": 19,
|
||||
@@ -1575,6 +1767,14 @@
|
||||
"message": "'app' is assigned a value but never used.",
|
||||
"hash": "aaaaa63e7a60443b8cbf8191feb9142852ebdf1c"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/components/FormEvaluation.vue",
|
||||
"line": 79,
|
||||
"column": 13,
|
||||
"ruleId": "vue/require-v-for-key",
|
||||
"message": "Elements in iteration expect to have 'v-bind:key' directives.",
|
||||
"hash": "422f53925922e59655d0f71624c19af75d41628c"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/index.js",
|
||||
"line": 12,
|
||||
@@ -1615,6 +1815,22 @@
|
||||
"message": "'evalFQDN' is assigned a value but never used.",
|
||||
"hash": "7fc32caafa23addddf44f3acbc5045b4523a0271"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/store.js",
|
||||
"line": 611,
|
||||
"column": 9,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'errors' is assigned a value but never used.",
|
||||
"hash": "c41cf979fc1626c38328dbf1028800c3395496bd"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/App.vue",
|
||||
"line": 282,
|
||||
"column": 7,
|
||||
"ruleId": "@typescript-eslint/no-unused-expressions",
|
||||
"message": "Expected an assignment or function call and instead saw an expression.",
|
||||
"hash": "de3a6e2bb10a80a2bacba665be74266c7efc7d64"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/index.js",
|
||||
"line": 16,
|
||||
@@ -1631,6 +1847,38 @@
|
||||
"message": "'app' is assigned a value but never used.",
|
||||
"hash": "2f161e663689e3e4dfe2c53b0d64c91a4d2b1a60"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillPersonBundle/Resources/public/vuejs/VisGraph/App.vue",
|
||||
"line": 263,
|
||||
"column": 19,
|
||||
"ruleId": "vue/return-in-computed-property",
|
||||
"message": "Expected to return a value in \"refreshNetwork\" computed property.",
|
||||
"hash": "2c1b08a49098c83b09058cedc0a962126e91e544"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillPersonBundle/Resources/public/vuejs/VisGraph/App.vue",
|
||||
"line": 270,
|
||||
"column": 7,
|
||||
"ruleId": "vue/no-side-effects-in-computed-properties",
|
||||
"message": "Unexpected side effect in \"legendLayers\" computed property.",
|
||||
"hash": "760948d2187c853f17ac9a1bd7107e883092d4f4"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillPersonBundle/Resources/public/vuejs/VisGraph/App.vue",
|
||||
"line": 281,
|
||||
"column": 5,
|
||||
"ruleId": "vue/no-dupe-keys",
|
||||
"message": "Duplicate key 'checkedLayers'. May cause name collision in script or template tag.",
|
||||
"hash": "447edb461e15e3ff5c60c8ecba88131e442539aa"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillPersonBundle/Resources/public/vuejs/VisGraph/App.vue",
|
||||
"line": 353,
|
||||
"column": 7,
|
||||
"ruleId": "@typescript-eslint/no-unused-expressions",
|
||||
"message": "Expected an assignment or function call and instead saw an expression.",
|
||||
"hash": "9cf656cbf1eb3d7cc0082e63adcd320b6093d14f"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillPersonBundle/Resources/public/vuejs/VisGraph/index.js",
|
||||
"line": 20,
|
||||
@@ -1639,6 +1887,22 @@
|
||||
"message": "'app' is assigned a value but never used.",
|
||||
"hash": "9e94e6412b8a44e47bfe8e66218cad09cff5bed4"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AccompanyingPeriod/SetReferrer.vue",
|
||||
"line": 42,
|
||||
"column": 16,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'response' is defined but never used.",
|
||||
"hash": "62de07b13c662e32332bb062038acee23978ea70"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AddPersons.vue",
|
||||
"line": 356,
|
||||
"column": 28,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'_response' is defined but never used.",
|
||||
"hash": "097e7788a2b5dea500b80b8a3cf968e57063a66a"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AddPersons/TypeUserGroup.vue",
|
||||
"line": 6,
|
||||
@@ -1654,5 +1918,45 @@
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'UserRenderBoxBadge' is defined but never used.",
|
||||
"hash": "99eba0d8633b2c9497417f4f61ec4194dbb2a96b"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillWopiBundle/src/Resources/public/module/pending/index.ts",
|
||||
"line": 4,
|
||||
"column": 3,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'StoredObjectStatus' is defined but never used.",
|
||||
"hash": "63f8c4572293916850d6165647774b27d4b732c6"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillWopiBundle/src/Resources/public/module/pending/index.ts",
|
||||
"line": 5,
|
||||
"column": 3,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'StoredObjectStatusChange' is defined but never used.",
|
||||
"hash": "a87c178e3eb5999bf0f46b3fa1c6da77e1be08b9"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillWopiBundle/src/Resources/public/module/pending/index.ts",
|
||||
"line": 30,
|
||||
"column": 61,
|
||||
"ruleId": "@typescript-eslint/no-unused-vars",
|
||||
"message": "'e' is defined but never used.",
|
||||
"hash": "02953121583f4f73742a19adab099ab63df9076e"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillWopiBundle/src/Resources/public/module/pending/index.ts",
|
||||
"line": 31,
|
||||
"column": 32,
|
||||
"ruleId": "@typescript-eslint/no-explicit-any",
|
||||
"message": "Unexpected any. Specify a different type.",
|
||||
"hash": "af48e21a1651b6017ede882dab249c00a818a44d"
|
||||
},
|
||||
{
|
||||
"path": "src/Bundle/ChillWopiBundle/src/Resources/public/module/pending/index.ts",
|
||||
"line": 37,
|
||||
"column": 16,
|
||||
"ruleId": "@typescript-eslint/no-explicit-any",
|
||||
"message": "Unexpected any. Specify a different type.",
|
||||
"hash": "7513ea552a0a649ce4ab93b6cf9d40bfef4f68d9"
|
||||
}
|
||||
]
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -18,9 +18,6 @@ migrations/*
|
||||
templates/*
|
||||
translations/*
|
||||
|
||||
# we allow developers to add customization on their installation, without commiting it
|
||||
config/packages/dev/*
|
||||
|
||||
###> symfony/framework-bundle ###
|
||||
/.env.local
|
||||
/.env.local.php
|
||||
|
||||
@@ -22,16 +22,16 @@ Chill is a comprehensive web application built as a set of Symfony bundles. It i
|
||||
- **Backend**: PHP 8.3+, Symfony 5.4
|
||||
- **Frontend**: JavaScript/TypeScript, Vue.js 3, Bootstrap 5
|
||||
- **Build Tools**: Webpack Encore, Yarn
|
||||
- **Database**: PostgreSQL with materialized views. We do not support other databases.
|
||||
- **Database**: PostgreSQL with materialized views
|
||||
- **Other Services**: Redis, AMQP (RabbitMQ), SMTP
|
||||
|
||||
## Project Structure
|
||||
|
||||
Note: This is a project that's existed for a long time, and throughout the years we've used multiple structures inside each bundle. When having the choice, the developers should choose the new structure.
|
||||
Note: This is a project which exists from a long time ago, and we found multiple structure inside each bundle. When having the choice, the developers should choose the new structure.
|
||||
|
||||
The project follows a standard Symfony bundle structure:
|
||||
- `/src/Bundle/`: Contains all the Chill bundles. The code is either at the root of the bundle directory, or within a `src/` directory (preferred). See psr4 mapping at the root's `composer.json`.
|
||||
- each bundle comes with its own tests, either in the `Tests` directory (when the code is directly within the bundle directory (for instance `src/Bundle/ChillMainBundle/Tests`, `src/Bundle/ChillPersonBundle/Tests`)), or inside the `tests` directory, alongside the `src/` sub-directory (example: `src/Bundle/ChillWopiBundle/tests`) (this is the preferred way).
|
||||
- each bundle come with his own tests, either in the `Tests` directory (when the code is directly within the bundle directory (for instance `src/Bundle/ChillMainBundle/Tests`, `src/Bundle/ChillPersonBundle/Tests`)), or inside the `tests` directory, alongside to the `src/` sub-directory (example: `src/Bundle/ChillWopiBundle/tests`) (this is the preferred way).
|
||||
- `/docs/`: Contains project documentation
|
||||
|
||||
Each bundle typically has the following structure:
|
||||
@@ -46,13 +46,13 @@ Each bundle typically has the following structure:
|
||||
|
||||
### A special word about TicketBundle
|
||||
|
||||
The ticket bundle is developed using a kind of "Command" pattern. The controller fills a "Command," and a "CommandHandler" handles this command. They are saved in the `src/Bundle/ChillTicketBundle/src/Action` directory.
|
||||
The ticket bundle is developed using a kind of "Command" pattern. The controller fill a "Command", and a "CommandHandler" handle this command. They are savec in the `src/Bundle/ChillTicketBundle/src/Action` directory.
|
||||
|
||||
## Development Guidelines
|
||||
|
||||
### Building and Configuration Instructions
|
||||
|
||||
All the commands should be run through the `symfony` command, which will configure the required variables.
|
||||
All the command should be run through the `symfony` command, which will configure the required variables.
|
||||
|
||||
For assets, we must ensure that we use node at version `^20.0.0`. This is done using `nvm use 20`.
|
||||
|
||||
@@ -87,7 +87,7 @@ For assets, we must ensure that we use node at version `^20.0.0`. This is done u
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
6. **Set Up the Database**:
|
||||
5. **Set Up the Database**:
|
||||
```bash
|
||||
# Create the database
|
||||
symfony console doctrine:database:create
|
||||
@@ -99,20 +99,20 @@ For assets, we must ensure that we use node at version `^20.0.0`. This is done u
|
||||
symfony console doctrine:fixtures:load
|
||||
```
|
||||
|
||||
7. **Build Assets**:
|
||||
6. **Build Assets**:
|
||||
```bash
|
||||
nvm use 20
|
||||
yarn run encore dev
|
||||
```
|
||||
|
||||
8. **Start the Development Server**:
|
||||
7. **Start the Development Server**:
|
||||
```bash
|
||||
symfony server:start -d
|
||||
```
|
||||
|
||||
#### Docker Setup
|
||||
|
||||
The project includes a Docker configuration for easier development:
|
||||
The project includes Docker configuration for easier development:
|
||||
|
||||
1. **Start Docker Services**:
|
||||
```bash
|
||||
@@ -149,97 +149,21 @@ Key configuration files:
|
||||
- `package.json`: JavaScript dependencies and scripts
|
||||
- `.env`: Default environment variables. Must usually not be updated: use `.env.local` instead.
|
||||
|
||||
### Database migrations
|
||||
|
||||
Each time a doctrine entity is created, we generate migration to adapt the database.
|
||||
|
||||
The migration is created using the command `symfony console doctrine:migrations:diff --no-interaction --namespace <namespace>`, where the namespace is the relevant namespace for migration. As this is a bash script, remember to quote the `\` (`\` must become `\\` in your command).
|
||||
|
||||
Each bundle has his own namespace for migration (always ask me to confirm that command with a list of updated / created entities so that I can confirm to you that it is ok):
|
||||
|
||||
- `Chill\Bundle\ActivityBundle` writes migrations to `Chill\Migrations\Activity`;
|
||||
- `Chill\Bundle\BudgetBundle` writes migrations to `Chill\Migrations\Budget`;
|
||||
- `Chill\Bundle\CustomFieldsBundle` writes migrations to `Chill\Migrations\CustomFields`;
|
||||
- `Chill\Bundle\DocGeneratorBundle` writes migrations to `Chill\Migrations\DocGenerator`;
|
||||
- `Chill\Bundle\DocStoreBundle` writes migrations to `Chill\Migrations\DocStore`;
|
||||
- `Chill\Bundle\EventBundle` writes migrations to `Chill\Migrations\Event`;
|
||||
- `Chill\Bundle\CalendarBundle` writes migrations to `Chill\Migrations\Calendar`;
|
||||
- `Chill\Bundle\FamilyMembersBundle` writes migrations to `Chill\Migrations\FamilyMembers`;
|
||||
- `Chill\Bundle\FranceTravailApiBundle` writes migrations to `Chill\Migrations\FranceTravailApi`;
|
||||
- `Chill\Bundle\JobBundle` writes migrations to `Chill\Migrations\Job`;
|
||||
- `Chill\Bundle\MainBundle` writes migrations to `Chill\Migrations\Main`;
|
||||
- `Chill\Bundle\PersonBundle` writes migrations to `Chill\Migrations\Person`;
|
||||
- `Chill\Bundle\ReportBundle` writes migrations to `Chill\Migrations\Report`;
|
||||
- `Chill\Bundle\TaskBundle` writes migrations to `Chill\Migrations\Task`;
|
||||
- `Chill\Bundle\ThirdPartyBundle` writes migrations to `Chill\Migrations\ThirdParty`;
|
||||
- `Chill\Bundle\TicketBundle` writes migrations to `Chill\Migrations\Ticket`;
|
||||
- `Chill\Bundle\WopiBundle` writes migrations to `Chill\Migrations\Wopi`;
|
||||
|
||||
Once created the, comment's classes should be removed and a description of the changes made to the entities should be added to the migrations, using the `getDescription` method. The migration should not be cleaned by any artificial intelligence, as modifying this migration is error prone.
|
||||
|
||||
### Guidelines related to code structure and requirements
|
||||
|
||||
#### Usage of clock
|
||||
|
||||
When we need to use a DateTime or DateTimeImmutable that need to express "now", we prefer the usage of
|
||||
`Symfony\Component\Clock\ClockInterface`, where possible. This is usually not possible in doctrine entities,
|
||||
where injection does not work when restoring an entity from a database, but usually possible in services.
|
||||
|
||||
In test, we use `\Symfony\Component\Clock\MockClock` which is an implementation of `Symfony\Component\Clock\ClockInterface`
|
||||
where we have full and easy control of the date.
|
||||
|
||||
### Testing Information
|
||||
|
||||
The project uses PHPUnit for testing. Each bundle has its own test suite, and there's also a global test suite at the root level.
|
||||
|
||||
#### Use of mock in tests
|
||||
|
||||
##### General mocking
|
||||
|
||||
For creating mock, we prefer using prophecy (library phpspec/prophecy).
|
||||
|
||||
##### Useful helpers and tips that avoid creating a mock
|
||||
|
||||
Some notable implementations that are test helpers and avoid creating a mock:
|
||||
|
||||
- `\Psr\Log\NullLogger`, an implementation of `\Psr\Log\LoggerInterface`;
|
||||
- `\Symfony\Component\Clock\MockClock`, an implementation of `Symfony\Component\Clock\ClockInterface` (already mentioned above);
|
||||
- `\Symfony\Component\HttpClient\MockHttpClient`, an implementation of `\Symfony\Contracts\HttpClient\HttpClientInterface`;
|
||||
- When using `\Symfony\Component\Mailer\MailerInterface`, we can create the mock with "InMemoryTransport":
|
||||
|
||||
```php
|
||||
use Symfony\Component\Mailer\Transport\InMemoryTransport;
|
||||
use \Symfony\Component\Mailer\Mailer;
|
||||
|
||||
$transport = new InMemoryTransport();
|
||||
$mailer = new Mailer($transport);
|
||||
|
||||
// After sending:
|
||||
$messages = $transport->getSent(); // array of SentMessage
|
||||
```
|
||||
- When using `\Symfony\Contracts\EventDispatcher\EventDispatcherInterface`, we can use directly an instance of `\Symfony\Component\EventDispatcher\EventDispatcher`;
|
||||
|
||||
##### When we prefer not creating a mock
|
||||
|
||||
- When we use Doctrine Entities related to the project, we prefer not to use a mock: we instantiate them directly (unless it requires too much code to write);
|
||||
|
||||
##### Mocking final and readonly classes
|
||||
|
||||
Classes marked as final can't be mocked. To avoid that, either:
|
||||
|
||||
- we remove the `final` keyword from the class;
|
||||
- we extract an interface from the final class.
|
||||
|
||||
This must be a decision made by a human, not by an AI. Every AI task must abort with an explicit message in that case.
|
||||
|
||||
#### Running Tests
|
||||
|
||||
The tests are run from the project's root (not from the bundle's root).
|
||||
|
||||
```bash
|
||||
# Run all tests
|
||||
vendor/bin/phpunit
|
||||
|
||||
# Run tests for a specific bundle
|
||||
vendor/bin/phpunit --testsuite NameBundle
|
||||
|
||||
# Run a specific test file
|
||||
vendor/bin/phpunit path/to/TestFile.php
|
||||
|
||||
@@ -247,9 +171,6 @@ vendor/bin/phpunit path/to/TestFile.php
|
||||
vendor/bin/phpunit --filter methodName path/to/TestFile.php
|
||||
```
|
||||
|
||||
When writing tests, only test specific files. Do not run all tests or the full
|
||||
test suite.
|
||||
|
||||
#### Test Structure
|
||||
|
||||
Tests are organized by bundle and follow the same structure as the bundle itself:
|
||||
@@ -297,7 +218,7 @@ class TicketTest extends TestCase
|
||||
|
||||
#### Test Database
|
||||
|
||||
For tests that require a database, the project uses a postgresql database filled with fixtures (usage of doctrine-fixtures). You can configure a different database for testing in the `.env.test` file.
|
||||
For tests that require a database, the project uses an in-memory SQLite database by default. You can configure a different database for testing in the `.env.test` file.
|
||||
|
||||
### Code Quality Tools
|
||||
|
||||
|
||||
268
CHANGELOG.md
268
CHANGELOG.md
@@ -6,274 +6,6 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
|
||||
and is generated by [Changie](https://github.com/miniscruff/changie).
|
||||
|
||||
|
||||
## v4.8.1 - 2025-11-20
|
||||
### Fixed
|
||||
* Insert name of file as the document title when uploading
|
||||
* Add missing path paramater 'id' for editing multiple participations
|
||||
* ([#471](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/471)) Hide the display of inactive user groups in the api
|
||||
|
||||
|
||||
## v4.8.0 - 2025-11-17
|
||||
### Feature
|
||||
* ([#461](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/461)) Make a calendar item on the 'mes rendez-vous' page clickable. Clicking will navigate to the edit page of the calendar item.
|
||||
### Fixed
|
||||
* ([#463](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/463)) Display calendar items for which an invite was accepted on the mes rendez-vous page
|
||||
* Improve accessibility on login page
|
||||
|
||||
### UX
|
||||
* ([#449](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/449)) Remove the label if there is only one scope and no scope picking field is displayed.
|
||||
|
||||
## v4.7.0 - 2025-11-10
|
||||
### Feature
|
||||
* ([#385](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/385)) Create invitation list in user menu
|
||||
* ([#404](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/404)) Add columns for comments linked to an activity in the activity list export
|
||||
### Fixed
|
||||
* ([#451](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/451)) Fix: display also social actions linked to parents of the selected social issue
|
||||
* ([#453](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/453)) Fix: export actions and their results in csv even when action does not have any goals attached to it.
|
||||
* Fix the possibility to delete a workflow
|
||||
|
||||
**Schema Change**: Drop or rename table or columns, or enforce new constraint that must be manually fixed
|
||||
* ([#457](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/457)) Fix the fusion of thirdparty properties that are located in another schema than public for TO_ONE relations + add extra loop for MANY_TO_MANY relations where thirdparty is the source instead of the target
|
||||
* ([#428](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/428)) Fix suggestion of referrer when creating notification for accompanyingPeriodWorkDocument
|
||||
### DX
|
||||
* Send notifications log to dedicated channel, if it exists
|
||||
|
||||
### UX
|
||||
* ([#425](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/425)) Change the terms 'cercle' and 'centre' to 'service', and 'territoire' respectively.
|
||||
* ([#542](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/542)) Improve the ux for selecting whether user wants to be notified of the final step of a workflow or all steps
|
||||
* Expand timeSpent choices for evaluation document and translate them to user locale or fallback 'fr'
|
||||
* ([#455](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/455)) Change the order of display for results and objectives in the social work/action form
|
||||
* Wrap text when it is too long within badges
|
||||
|
||||
## v4.6.1 - 2025-10-27
|
||||
### Fixed
|
||||
* Fix export case where no 'reason' is picked within the PersonHavingActivityBetweenDateFilter.php
|
||||
|
||||
## v4.6.0 - 2025-10-15
|
||||
### Feature
|
||||
* ([#423](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/423)) Create environment banner that can be activated and configured depending on the image deployed
|
||||
* ([#394](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/394)) Only show active workflow on the page "my tracked workflow"
|
||||
### Fixed
|
||||
* Fix loading of classLists in SocialIssuesAcc.vue, ensure elements are present
|
||||
* Fix the rendering of list of StoredObjectVersions, where there are kept version (before converting to pdf) and intermediate versions deleted
|
||||
* ([#434](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/434)) Notification: fix editing of sent notification by removing form.addressesEmails, a field that no longer exists
|
||||
* Fix loading of social issues and social actions within vue component
|
||||
* ([#446](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/446)) Add unique condition on stored object filename, with cleaning step on existing duplicate filenames
|
||||
|
||||
**Schema Change**: Drop or rename table or columns, or enforce new constraint that must be manually fixed
|
||||
* [workflow] take permissions into account to delete the workflow attachment
|
||||
* ([#448](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/448)) Fix the execution of daily cronjob notification, when the previous last execution storage was invalid
|
||||
|
||||
## v4.5.1 - 2025-10-03
|
||||
### Fixed
|
||||
* Add missing javascript dependency
|
||||
* Add exception handling for conversion of attachment on sending external, when documens are already in pdf
|
||||
|
||||
## v4.5.0 - 2025-10-03
|
||||
### Feature
|
||||
* Only allow delete of attachment on workflows that are not final
|
||||
* Move up signature buttons on index workflow page for easier access
|
||||
* Filter out document from attachment list if it is the same as the workflow document
|
||||
* Block edition on attached document on workflow, if the workflow is finalized or sent external
|
||||
* Convert workflow's attached document to pdf while sending them external
|
||||
* After a signature is canceled or rejected, going to a waiting page until the post-process routines apply a workflow transition
|
||||
### Fixed
|
||||
* ([#426](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/426)) Increased the number of required characters when setting a new password in Chill from 9 to 14 - GDPR compliance
|
||||
* Fix permissions on storedObject which are subject by a workflow
|
||||
### DX
|
||||
* Introduce a WaitingScreen component to display a waiting screen
|
||||
|
||||
## v4.4.2 - 2025-09-12
|
||||
### Fixed
|
||||
* Fix document generation and workflow generation do not work on accompanying period work documents
|
||||
|
||||
## v4.4.1 - 2025-09-11
|
||||
### Fixed
|
||||
* fix translations in duplicate evaluation document modal and realign close modal button
|
||||
|
||||
## v4.4.0 - 2025-09-11
|
||||
### Feature
|
||||
* ([#359](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/359)) Allow the merge of two accompanying period works
|
||||
* ([#369](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/369)) Duplication of a document to another accompanying period work evaluation
|
||||
* ([#359](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/359)) Fusion of two accompanying period works
|
||||
### Fixed
|
||||
* Fix display of 'duplicate' and 'merge' buttons in CRUD templates
|
||||
* Fix saving notification preferences in user's profile
|
||||
|
||||
## v4.3.0 - 2025-09-08
|
||||
### Feature
|
||||
* ([#409](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/409)) Add 45 and 60 min calendar ranges
|
||||
* Add a command to generate a list of permissions
|
||||
* ([#412](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/412)) Add an absence end date
|
||||
|
||||
**Schema Change**: Add columns or tables
|
||||
### Fixed
|
||||
* fix date formatting in calendar range display
|
||||
* Change route URL to avoid clash with person duplicate controller method
|
||||
|
||||
## v4.2.1 - 2025-09-03
|
||||
### Fixed
|
||||
* Fix exports to work with DirectExportInterface
|
||||
### DX
|
||||
* Improve error message when a stored object cannot be written on local disk
|
||||
|
||||
|
||||
## v4.2.0 - 2025-09-02
|
||||
### Feature
|
||||
* ([#64](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/64)) Add external identifier for a Person
|
||||
|
||||
**Schema Change**: Add columns or tables
|
||||
* ([#330](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/330) Allow users to choose for which notifications they want to receive an email
|
||||
### Fixed
|
||||
* ([#422](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/422)) Fixed html layout of pages for recovering password
|
||||
* Fix typo in 'uncheckAll' script for centers selection
|
||||
* Fix incorrect parameter name in event details link
|
||||
|
||||
## v4.1.0 - 2025-08-26
|
||||
### Feature
|
||||
* ([#400](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/400)) Add filter to social actions list to filter out actions where current user intervenes
|
||||
* ([#399](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/399)) Show filters on list pages unfolded by default
|
||||
* Expansion of event module with new fields in the creation form: thematic, internal/external animator, responsable, and budget elements. Filtering options in the event list + adapted exports
|
||||
|
||||
**Schema Change**: Add columns or tables
|
||||
### Fixed
|
||||
* ([#382](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/382)) adjust display logic for accompanying period dates, include closing date if period is closed.
|
||||
* ([#384](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/384)) add min and step attributes to integer field in DateIntervalType
|
||||
### UX
|
||||
* Limit display of participations in event list
|
||||
|
||||
## v4.0.2 - 2025-07-09
|
||||
### Fixed
|
||||
* Fix add missing translation
|
||||
* Fix the transfer of evaluations and documents during of accompanyingperiodwork
|
||||
|
||||
## v4.0.1 - 2025-07-08
|
||||
### Fixed
|
||||
* Fix package.json for compilation
|
||||
|
||||
|
||||
## v4.0.0 - 2025-07-08
|
||||
### Feature
|
||||
* ([#359](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/359)) Allow the merge of two accompanying period works
|
||||
### Fixed
|
||||
* ([#390](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/390)) Display the list of participant in the results, even if there is only one participant and that the search result display the requestor
|
||||
* Fix admin entity edit actions for event admin entities and activity reason (category) entities
|
||||
* Fix translations for social action fields in admin form: results, goals, evaluations
|
||||
### DX
|
||||
* Rewrite exports to run them asynchronously
|
||||
|
||||
**Schema Change**: Add columns or tables
|
||||
* Allow TranslatableMessage in flash messages
|
||||
### UX
|
||||
* Improve labeling of fields in person resource creation form
|
||||
|
||||
|
||||
**Release notes**
|
||||
|
||||
- Add new methods to serialize data using the rector rule
|
||||
- Remove all references to the Request in filters, aggregators, filters. Actually, the most frequent occurence is `$security->getUser()`.
|
||||
- Refactor manually the initializeQuery method
|
||||
- Remove the injection of ExportManager into the constructor of each export element:
|
||||
|
||||
```diff
|
||||
|
||||
- class MyFormatter implements FormatterInterface
|
||||
+ class MyFormatter implements FormatterInterface, \Chill\MainBundle\Export\ExportManagerAwareInterface
|
||||
{
|
||||
+ use \Chill\MainBundle\Export\Helper\ExportManagerAwareTrait;
|
||||
|
||||
- public function __construct(private ExportManager $exportmanager) {}
|
||||
|
||||
public function MyMethod(): void
|
||||
{
|
||||
- $this->exportManager->getFilter('alias');
|
||||
+ $this->getExportManager()->getFilter('alias');
|
||||
}
|
||||
}
|
||||
```
|
||||
- configure messenger to handle export in a queue:
|
||||
|
||||
```diff
|
||||
# config/packages/messenger.yaml
|
||||
framework:
|
||||
messenger:
|
||||
routing:
|
||||
+ 'Chill\MainBundle\Export\Messenger\ExportRequestGenerationMessage': priority
|
||||
```
|
||||
|
||||
- add missing methods to exports, aggregators, filters, formatter:
|
||||
|
||||
```php
|
||||
public function normalizeFormData(array $formData): array;
|
||||
|
||||
public function denormalizeFormData(array $formData, int $fromVersion): array;
|
||||
```
|
||||
|
||||
There are rector rules to generate those methods:
|
||||
|
||||
- `Chill\Utils\Rector\Rector\ChillBundleAddNormalizationMethodsOnExportRector`
|
||||
|
||||
See:
|
||||
|
||||
```php
|
||||
// upgrade chill exports
|
||||
$rectorConfig->rules([\Chill\Utils\Rector\Rector\ChillBundleAddNormalizationMethodsOnExportRector::class]);
|
||||
```
|
||||
|
||||
This rule will create most of the work necessary, but some manuals changes are still necessary:
|
||||
|
||||
- we must set manually the correct repository for method `denormalizeDoctrineEntity`;
|
||||
- when the form data contains some entities, and the form type is not one of EntityType::class, PickUserDynamicType::class, PickUserLocationType::class, PickThirdpartyDynamicType::class, Select2CountryType::class, then we must handle the normalization manually (using the `\Chill\MainBundle\Export\ExportDataNormalizerTrait`)
|
||||
|
||||
|
||||
|
||||
## v3.12.1 - 2025-06-30
|
||||
### Fixed
|
||||
* Fix loading of the list of documents
|
||||
|
||||
## v3.12.0 - 2025-06-30
|
||||
### Feature
|
||||
* ([#377](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/377)) Add the document file name to the document title when a user upload a document, unless there is already a document title.
|
||||
* Add desactivation date for social action and issue csv export
|
||||
* Add Emoji and Fullscreen feature to ckeditor configuration
|
||||
* ([#321](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/321)) Create editor which allow us to toggle between rich and simple text editor
|
||||
* Do not remove workflow which are automatically canceled after staling for more than 30 days
|
||||
### Fixed
|
||||
* ([#376](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/376)) trying to prevent bug of typeerror in doc-history + improved display of document history
|
||||
* ([#381](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/381)) Display previous participation in acc course work even if the person has left the acc course
|
||||
* ([#372](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/372)) Fix display of text in calendar events
|
||||
* Add missing translation for user_group.no_user_groups
|
||||
* Fix admin entity edit actions for event admin entities and activity reason (category) entities
|
||||
* ([#392](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/392)) Allow null and cast as string to setContent method for NewsItem
|
||||
|
||||
* ([#393](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/393)) Doc Generation: the "dump only" method send the document as an email attachment.
|
||||
### DX
|
||||
* ([#352](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/352)) Remove dead code for wopi-link module
|
||||
* Replace library node-sass by sass, and upgrade bootstrap to version 5.3 (yarn upgrade / install is required)
|
||||
### UX
|
||||
* ([#374](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/374)) Remove default filter in_progress for the page 'my tasks'; Allows for new tasks to be displayed upon opening of the page
|
||||
* Improve labeling of fields in person resource creation form
|
||||
|
||||
## v3.11.0 - 2025-04-17
|
||||
### Feature
|
||||
* ([#365](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/365)) Add counters of actions and activities, with 2 boxes to (1) show the number of active actions on total actions and (2) show the number of activities in a accompanying period, and pills in menus for showing the number of active actions and the number of activities.
|
||||
* ([#364](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/364)) Added a second phone number "telephone2" to the thirdParty entity. Adapted twig templates and vuejs apps to handle this phone number
|
||||
|
||||
**Schema Change**: Add columns or tables
|
||||
* Signature: add a button to go directly to the signature zone, even if there is only one
|
||||
### Fixed
|
||||
* Fixed wrong translations in the on-the-fly for creation of thirdParty
|
||||
* Fixed update of phone number in on-the-fly edition of thirdParty
|
||||
* Fixed closing of modal when editing thirdParty in accompanying course works
|
||||
* Shorten the delay between two execution of AccompanyingPeriodStepChangeCronjob, to ensure at least one execution in a day
|
||||
* ([#102](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/102)) Fix display of title in document list
|
||||
* When cleaning the old stored object versions, do not throw an error if the stored object is not found on disk
|
||||
* Add consistent log prefix and key to logs when stale workflows are automatically canceled
|
||||
* ([#380](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/380)) Remove the "not null" validation constraint on recently added properties on HouseholdComposition
|
||||
|
||||
### DX
|
||||
* Add new chill-col style for displaying title and aside in a flex table
|
||||
|
||||
## v3.10.3 - 2025-03-18
|
||||
### DX
|
||||
* Eslint fixes
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
"ext-openssl": "*",
|
||||
"ext-redis": "*",
|
||||
"ext-zlib": "*",
|
||||
"champs-libres/wopi-bundle": "dev-symfony-v5@dev",
|
||||
"champs-libres/wopi-bundle": "dev-master@dev",
|
||||
"champs-libres/wopi-lib": "dev-master@dev",
|
||||
"doctrine/data-fixtures": "^1.8",
|
||||
"doctrine/doctrine-bundle": "^2.1",
|
||||
@@ -54,7 +54,6 @@
|
||||
"symfony/http-client": "^5.4",
|
||||
"symfony/http-foundation": "^5.4",
|
||||
"symfony/intl": "^5.4",
|
||||
"symfony/loco-translation-provider": "^6.0",
|
||||
"symfony/mailer": "^5.4",
|
||||
"symfony/messenger": "^5.4",
|
||||
"symfony/mime": "^5.4",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
return [
|
||||
Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
|
||||
loophp\PsrHttpMessageBridgeBundle\PsrHttpMessageBridgeBundle::class => ['all' => true],
|
||||
ChampsLibres\WopiBundle\WopiBundle::class => ['all' => true],
|
||||
Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true],
|
||||
Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true],
|
||||
@@ -36,5 +37,4 @@ return [
|
||||
Chill\WopiBundle\ChillWopiBundle::class => ['all' => true],
|
||||
Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true],
|
||||
Symfony\UX\Translator\UxTranslatorBundle::class => ['all' => true],
|
||||
loophp\PsrHttpMessageBridgeBundle\PsrHttpMessageBridgeBundle::class => ['all' => true],
|
||||
];
|
||||
|
||||
@@ -1,13 +1,6 @@
|
||||
chill_main:
|
||||
available_languages: [ '%env(resolve:LOCALE)%', 'en', 'nl' ]
|
||||
available_languages: [ '%env(resolve:LOCALE)%', 'en' ]
|
||||
available_countries: ['BE', 'FR']
|
||||
top_banner:
|
||||
visible: false
|
||||
text:
|
||||
fr: 'Vous travaillez actuellement avec la version de PRÉ-PRODUCTION.'
|
||||
nl: 'Je werkt momenteel in de PRE-PRODUCTIE versie'
|
||||
color: '#353535'
|
||||
background_color: '#d8bb48'
|
||||
notifications:
|
||||
from_email: '%env(resolve:NOTIFICATION_FROM_EMAIL)%'
|
||||
from_name: '%env(resolve:NOTIFICATION_FROM_NAME)%'
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
chill_aside_activity:
|
||||
show_concerned_persons_count: hidden
|
||||
@@ -62,10 +62,8 @@ framework:
|
||||
'Chill\MainBundle\Workflow\Messenger\PostSignatureStateChangeMessage': priority
|
||||
'Chill\MainBundle\Workflow\Messenger\PostPublicViewMessage': async
|
||||
'Chill\MainBundle\Service\Workflow\CancelStaleWorkflowMessage': async
|
||||
'Chill\MainBundle\Notification\Email\NotificationEmailMessages\SendImmediateNotificationEmailMessage': async
|
||||
'Chill\MainBundle\Export\Messenger\ExportRequestGenerationMessage': priority
|
||||
'Chill\MainBundle\Export\Messenger\RemoveExportGenerationMessage': async
|
||||
'Chill\MainBundle\Notification\Email\NotificationEmailMessages\ScheduleDailyNotificationDigestMessage': async
|
||||
# end of routes added by chill-bundles recipes
|
||||
# Route your messages to the transports
|
||||
# 'App\Message\YourMessage': async
|
||||
|
||||
@@ -1,12 +1,7 @@
|
||||
# config/packages/translation.yaml
|
||||
framework:
|
||||
default_locale: '%env(resolve:LOCALE)%' # LOCALE=fr in .env
|
||||
default_locale: en
|
||||
translator:
|
||||
default_path: '%kernel.project_dir%/translations'
|
||||
fallbacks:
|
||||
- '%env(resolve:LOCALE)%' # fr
|
||||
- en
|
||||
providers:
|
||||
loco:
|
||||
dsn: '%env(LOCO_DSN)%'
|
||||
domains: [ 'messages' ]
|
||||
locales: [ 'fr', 'nl' ]
|
||||
|
||||
4
config/packages/translation_chill.yaml
Normal file
4
config/packages/translation_chill.yaml
Normal file
@@ -0,0 +1,4 @@
|
||||
framework:
|
||||
default_locale: '%env(resolve:LOCALE)%'
|
||||
translator:
|
||||
fallbacks: [ '%env(resolve:LOCALE)%' ]
|
||||
@@ -23,8 +23,8 @@ class "Document" {
|
||||
- text description
|
||||
- ArrayCollection_DocumentCategory categories
|
||||
- varchar_150 content #link to openstack
|
||||
- Territoire territoire
|
||||
- Service service
|
||||
- Center center
|
||||
- Cercle cercle
|
||||
- User user
|
||||
- DateTime date # Creation date
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ Certaines données sont historisées:
|
||||
|
||||
- les référents d'un parcours;
|
||||
- les statuts d'un parcours;
|
||||
- la liaison entre les territoires et les usagers;
|
||||
- la liaison entre les centres et les usagers;
|
||||
- etc.
|
||||
|
||||
Dans ces cas-là, Chill crée généralement deux colonnes, qui sont habituellement nommées :code:`startDate` et :code:`endDate`. Lorsque la colonne :code:`endDate` est à :code:`NULL`, cela signifie que la période n'est pas "fermée". La colonne :code:`startDate` n'est pas nullable.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
order,table_schema,table_name,commentaire
|
||||
1,chill_3party,party_category,Catégorie de tiers
|
||||
2,chill_3party,party_center,Association entre les tiers et les territoires (déprécié)
|
||||
2,chill_3party,party_center,Association entre les tiers et les centres (déprécié)
|
||||
3,chill_3party,party_profession,Profession du tiers (déprécié)
|
||||
4,chill_3party,third_party,Tiers
|
||||
5,chill_3party,thirdparty_category,association tiers - catégories
|
||||
@@ -54,7 +54,7 @@ order,table_schema,table_name,commentaire
|
||||
53,public,activitytpresence,Présence aux échanges
|
||||
54,public,activitytype,Types d'échanges
|
||||
55,public,activitytypecategory,Catégories de types d'échanges
|
||||
56,public,centers,"Territoires (territoires, agences, etc.)"
|
||||
56,public,centers,"Centres (territoires, agences, etc.)"
|
||||
57,public,chill_activity_activity_chill_person_socialaction,
|
||||
58,public,chill_activity_activity_chill_person_socialissue
|
||||
59,public,chill_docgen_template,Gabarits de documents
|
||||
@@ -111,7 +111,7 @@ order,table_schema,table_name,commentaire
|
||||
110,public,chill_person_marital_status,Etats civils
|
||||
111,public,chill_person_not_duplicate,
|
||||
112,public,chill_person_person,Usagers
|
||||
113,public,chill_person_person_center_history,Historique des territoires d'un usagers
|
||||
113,public,chill_person_person_center_history,Historique des centres d'un usagers
|
||||
114,public,chill_person_persons_to_addresses,Déprécié
|
||||
115,public,chill_person_phone,Numéros d etéléphone supplémentaires d'un usager
|
||||
116,public,chill_person_relations,Types de relations de filiation
|
||||
@@ -142,7 +142,7 @@ order,table_schema,table_name,commentaire
|
||||
141,public,permission_groups
|
||||
142,public,permissionsgroup_rolescope
|
||||
143,public,persons_spoken_languages
|
||||
144,public,regroupment,Regroupement de territoires
|
||||
144,public,regroupment,Regroupement de centres
|
||||
145,public,regroupment_center,
|
||||
146,public,role_scopes,
|
||||
147,public,scopes,Services
|
||||
|
||||
|
@@ -1,419 +0,0 @@
|
||||
============================================
|
||||
Directives for creating new translation keys
|
||||
============================================
|
||||
|
||||
These directives are meant to ensure better consistency across bundles, avoid duplication, and make keys more predictable.
|
||||
|
||||
|
||||
General Principles
|
||||
==================
|
||||
|
||||
1. **Use lowercase snake_case for all keys**
|
||||
|
||||
2. **Use dot-separated namespaces**
|
||||
The dot is used to reflect:
|
||||
- bundle
|
||||
- feature
|
||||
- sub-feature
|
||||
- key type
|
||||
|
||||
3. **Do not use spaces in keys**
|
||||
|
||||
4. **Avoid duplicating the same text in multiple places**
|
||||
When a translation is needed, try a search for the translation value first and see if it exists elsewhere
|
||||
|
||||
5. **If a key is used across multiple bundles, it must live in ChillMainBundle.**
|
||||
|
||||
6. **If a key is used across multiple bundles and is a generic term, it must be placed in the ``common`` namespace.**
|
||||
|
||||
|
||||
Key Structure
|
||||
=============
|
||||
|
||||
We use the following structure:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
<scope>.<feature>.<sub-feature>.<key-type>
|
||||
|
||||
Where:
|
||||
|
||||
* ``<>`` identifies the bundle or shared context
|
||||
* ``<feature>`` identifies the part of the module using the translation
|
||||
* ``<element>`` describes the text purpose
|
||||
* ``<subelement>`` for a multi-level element ( eg. activity.export.person.count.description)
|
||||
|
||||
Examples of scopes
|
||||
------------------
|
||||
|
||||
* ``activity`` — ChillActivityBundle
|
||||
* ``person`` — ChillPersonBundle
|
||||
* ``common`` — neutral shared translation values
|
||||
|
||||
|
||||
Naming Scopes
|
||||
=============
|
||||
|
||||
1. **Bundle-specific keys**
|
||||
|
||||
For most things inside a bundle:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
activity.<feature>.<element>
|
||||
|
||||
Example:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
activity.form.save
|
||||
activity.list.title
|
||||
activity.entity.type
|
||||
activity.menu.activities
|
||||
activity.controller.success_created
|
||||
|
||||
2. **Shared UI elements (buttons, labels, generic text)**
|
||||
|
||||
These belong in the ``common`` namespace in ChillMainBundle:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
common.save
|
||||
common.delete
|
||||
common.edit
|
||||
common.filter
|
||||
common.duration_time
|
||||
|
||||
Translation workflow
|
||||
====================
|
||||
|
||||
Use the following workflow when deciding where a key belongs:
|
||||
|
||||
1. **Is this text used in more than one bundle?**
|
||||
→ Place in ``main`` or ``common``
|
||||
|
||||
2. **Is this text generic UI (button, label, pagination, yes/no)?**
|
||||
→ Place in ``common``
|
||||
|
||||
3. **Is this text specific to one bundle and one feature?**
|
||||
→ Place in ``<bundle>.feature.<element>``
|
||||
|
||||
4. **Is this text related to an entity or value object?**
|
||||
→ Place in ``<bundle>.entity.<entityname>.<field>``
|
||||
|
||||
5. **Is this text used in forms?**
|
||||
→ ``<bundle>.form.<field>`` or ``<bundle>.form.<action>``
|
||||
|
||||
6. **Is this text related to exports?**
|
||||
→ ``<bundle>.export.<feature>.<column>``
|
||||
|
||||
7. **Is it related to filtering, searching or parameters?**
|
||||
→ ``<bundle>.filter.<name>`` or
|
||||
→ ``<bundle>.filter.<feature>.<field>`` for nested filters
|
||||
|
||||
|
||||
Examples based on translations within ChillActivityBundle
|
||||
=========================================================
|
||||
|
||||
Below are concrete examples from ``ChillActivityBundle``,
|
||||
refactored according to the guidelines.
|
||||
|
||||
|
||||
General activity keys
|
||||
---------------------
|
||||
|
||||
Instead of scattered keys like::
|
||||
|
||||
Show the activity
|
||||
Edit the activity
|
||||
Activity
|
||||
Duration time
|
||||
...
|
||||
|
||||
We use:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
activity.general.show
|
||||
activity.general.edit
|
||||
activity.general.title
|
||||
activity.general.duration
|
||||
activity.general.travel_time
|
||||
activity.general.attendee
|
||||
activity.general.remark
|
||||
activity.general.no_comments
|
||||
|
||||
|
||||
Forms
|
||||
-----
|
||||
|
||||
Instead of keys like::
|
||||
|
||||
Activity creation
|
||||
Save activity
|
||||
Reset form
|
||||
Choose a type
|
||||
|
||||
Use:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
activity.form.title_create
|
||||
activity.form.save
|
||||
activity.form.reset
|
||||
activity.form.choose_type
|
||||
activity.form.choose_duration
|
||||
|
||||
Long lists (like durations) should be grouped:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
activity.form.duration.5min
|
||||
activity.form.duration.10min
|
||||
activity.form.duration.15min
|
||||
activity.form.duration.1h
|
||||
activity.form.duration.1h30
|
||||
activity.form.duration.2h
|
||||
...
|
||||
|
||||
Entities
|
||||
--------
|
||||
|
||||
Entity fields should follow:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
activity.entity.activity.date
|
||||
activity.entity.activity.comment
|
||||
activity.entity.activity.deleted
|
||||
activity.entity.location.name
|
||||
activity.entity.location.type
|
||||
|
||||
|
||||
Controller messages
|
||||
-------------------
|
||||
|
||||
Instead of strings as keys::
|
||||
|
||||
'Success : activity created!'
|
||||
'The form is not valid. The activity has not been created !'
|
||||
|
||||
Use:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
activity.controller.success_created
|
||||
activity.controller.error_invalid_create
|
||||
activity.controller.success_updated
|
||||
activity.controller.error_invalid_update
|
||||
|
||||
|
||||
Roles
|
||||
-----
|
||||
|
||||
Access control keys should be:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
activity.role.create
|
||||
activity.role.update
|
||||
activity.role.see
|
||||
activity.role.see_details
|
||||
activity.role.delete
|
||||
activity.role.stats
|
||||
activity.role.list
|
||||
|
||||
|
||||
Admin
|
||||
-----
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
activity.admin.configuration
|
||||
activity.admin.types
|
||||
activity.admin.reasons
|
||||
activity.admin.reason_category
|
||||
activity.admin.presence
|
||||
|
||||
|
||||
CRUD
|
||||
----
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
activity.crud.type.title_new
|
||||
activity.crud.type.title_edit
|
||||
activity.crud.presence.title_new
|
||||
|
||||
|
||||
Activity Reason
|
||||
---------------
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
activity.reason.list
|
||||
activity.reason.create
|
||||
activity.reason.active
|
||||
activity.reason.category
|
||||
activity.reason.entity_title
|
||||
|
||||
|
||||
Exports
|
||||
-------
|
||||
|
||||
Group them logically:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
activity.export.person.count.title
|
||||
activity.export.person.count.description
|
||||
activity.export.person.count.header
|
||||
|
||||
activity.export.period.sum_duration.title
|
||||
activity.export.period.sum_duration.description
|
||||
activity.export.period.sum_duration.header
|
||||
|
||||
|
||||
Filters
|
||||
-------
|
||||
|
||||
Use hierarchical filters:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
activity.filter.by_reason
|
||||
activity.filter.by_type
|
||||
activity.filter.by_date
|
||||
activity.filter.by_location
|
||||
activity.filter.by_sent_received
|
||||
activity.filter.by_user
|
||||
|
||||
|
||||
Aggregators
|
||||
-----------
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
activity.aggregator.reason.by_category
|
||||
activity.aggregator.reason.level
|
||||
activity.aggregator.user.by_scope
|
||||
activity.aggregator.user.by_job
|
||||
|
||||
|
||||
Global/Shared Keys
|
||||
==================
|
||||
|
||||
Keys like the following **must not be redeclared** in each bundle:
|
||||
|
||||
- First name
|
||||
- Last name
|
||||
- Username
|
||||
- ID
|
||||
- Type
|
||||
- Duration
|
||||
- Comment
|
||||
- Date
|
||||
- Location
|
||||
- Present / Not present
|
||||
- Add / Edit / Delete / Save / Update
|
||||
|
||||
These belong in ``common`` or ``main``:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
common.firstname
|
||||
common.lastname
|
||||
common.username
|
||||
common.id
|
||||
common.type
|
||||
common.comment
|
||||
common.date
|
||||
common.location
|
||||
common.present
|
||||
common.absent
|
||||
common.add
|
||||
common.edit
|
||||
common.delete
|
||||
common.save
|
||||
common.update
|
||||
|
||||
|
||||
Naming directives summary
|
||||
==========================
|
||||
|
||||
* **snake_case**
|
||||
* **namespaced with dots**
|
||||
* **bundle prefix for bundle-specific concepts**
|
||||
* **common or main for shared concepts**
|
||||
* **avoid free-floating keys (without namespace)**
|
||||
* **reuse common keys wherever possible**
|
||||
|
||||
|
||||
Migration Strategy (Optional)
|
||||
=============================
|
||||
|
||||
To apply this structure progressively:
|
||||
|
||||
1. New keys must follow these guidelines.
|
||||
2. Existing keys may remain as-is until refactored.
|
||||
3. When refactoring:
|
||||
- Move cross-bundle keys to ChillMainBundle and possible `common` namespace.
|
||||
- Replace duplicated keys with shared ones.
|
||||
|
||||
===========================================
|
||||
Avoiding duplicate translations
|
||||
===========================================
|
||||
|
||||
1. Use Shared Namespaces
|
||||
========================
|
||||
|
||||
Two namespaces must be used for shared translations:
|
||||
|
||||
* ``common.*`` — generic UI concepts (save, delete, date, name, etc.)
|
||||
|
||||
If a translation may be reused in multiple bundles, it must be placed
|
||||
in the ``common`` namespace or in ChillMainBundle.
|
||||
|
||||
2. Bundle-Specific Keys
|
||||
=======================
|
||||
|
||||
Keys belonging only to one bundle or one feature are namespaced inside that
|
||||
bundle:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
activity.<feature>.<element>
|
||||
person.<feature>.<element>
|
||||
|
||||
3. Search Before Creating
|
||||
=========================
|
||||
|
||||
Before adding a new translation key, developers must:
|
||||
|
||||
1. For common translations like: "enregistrer/opslaan" look in the `common` namespace.
|
||||
3. Search in Loco or translations for existing values.
|
||||
|
||||
If a suitable key exists, reuse it.
|
||||
|
||||
4. Only Create a New Key When Necessary
|
||||
=======================================
|
||||
|
||||
Create a new key only when the text is:
|
||||
|
||||
* specific to the bundle
|
||||
* specific to the feature
|
||||
* not reusable elsewhere
|
||||
|
||||
6. Progressive Cleanup
|
||||
======================
|
||||
|
||||
Old duplicates may remain temporarily. When updating code in an area, clean
|
||||
duplicate values by moving them into ``common`` or ``main``.
|
||||
|
||||
General workflow
|
||||
================
|
||||
|
||||
* **Reuse shared keys** within ``common`` namespace.
|
||||
* **Search before creating** new keys.
|
||||
* **Namespace bundle-specific keys** under their bundle.
|
||||
* **Refactor progressively** when touching old code.
|
||||
@@ -1,148 +0,0 @@
|
||||
=======================================================================
|
||||
Managing translations within CHILL using Loco as a translation provider
|
||||
=======================================================================
|
||||
|
||||
Within CHILL we make use of Symfony's translation component together with *Loco* as an external
|
||||
translation provider. Using this setup centralise translations in a single online
|
||||
location (Loco), while still allowing developers to create and update
|
||||
translation keys locally in the project (YAML files).
|
||||
|
||||
Workflow
|
||||
========
|
||||
|
||||
We use the following workflow:
|
||||
|
||||
* Developers create translation keys in YAML files inside each bundle.
|
||||
* Keys are written in **English**.
|
||||
* Application UI defaults to **French**, with **Dutch** as an additional locale (other languages can be added in the future).
|
||||
* Loco acts as the central translation memory and synchronisation source.
|
||||
* Loco Symfony package was installed so that built-in translation commands can be used to push/pull content
|
||||
between Loco and the local project.
|
||||
|
||||
|
||||
Translation directory structure
|
||||
===============================
|
||||
|
||||
Each bundle contains its own ``translations`` directory, for example::
|
||||
|
||||
chill-bundles/
|
||||
ChillCoreBundle/
|
||||
translations/
|
||||
messages.fr.yml
|
||||
messages.nl.yml
|
||||
ChillPersonBundle/
|
||||
translations/
|
||||
messages.fr.yml
|
||||
messages.nl.yml
|
||||
...
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
The translation configuration is defined in
|
||||
``config/packages/translation.yaml``::
|
||||
|
||||
framework:
|
||||
default_locale: '%env(resolve:LOCALE)%'
|
||||
translator:
|
||||
default_path: '%kernel.project_dir%/translations'
|
||||
fallbacks:
|
||||
- '%env(resolve:LOCALE)%'
|
||||
- 'en'
|
||||
providers:
|
||||
loco:
|
||||
dsn: '%env(LOCO_DSN)%'
|
||||
domains: [ 'messages' ]
|
||||
locales: [ 'fr', 'nl' ]
|
||||
|
||||
Note:
|
||||
|
||||
* ``en`` is the **source locale** in Loco.
|
||||
* ``fr`` and ``nl`` are the **application locales**.
|
||||
* ``domains: [messages]`` means only ``messages.*.yml`` files are pushed.
|
||||
|
||||
|
||||
Environment variables
|
||||
---------------------
|
||||
|
||||
In ``.env``::
|
||||
|
||||
LOCALE=fr
|
||||
|
||||
In ``.env.local``::
|
||||
|
||||
LOCO_DSN="loco://API_KEY@default"
|
||||
|
||||
Replace ``API_KEY`` with the key provided by Loco.
|
||||
|
||||
|
||||
Working with Loco
|
||||
=================
|
||||
|
||||
Loco shows all translation keys under three languages:
|
||||
|
||||
* **English (source)** — keys are listed but remain “untranslated”
|
||||
* **French** — translated strings for French users
|
||||
* **Dutch** — translated strings for Dutch users
|
||||
|
||||
Note: Don't add translations directly in the English column.
|
||||
This column simply represents the *key*.
|
||||
|
||||
|
||||
Pushing translations to Loco
|
||||
============================
|
||||
|
||||
You can push local translations to Loco using:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
symfony console translation:push loco --locales=fr --locales=nl --force
|
||||
|
||||
This will:
|
||||
|
||||
* Upload all French and Dutch translation values from ``*.fr.yml`` and
|
||||
``*.nl.yml`` files
|
||||
* Ensures Loco stays in sync with local YAML files
|
||||
* Creates any missing keys in Loco
|
||||
|
||||
|
||||
Pulling translations from Loco
|
||||
==============================
|
||||
|
||||
When translators update strings in Loco, developers can fetch updates with:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
symfony console translation:pull loco --locales=fr --locales=nl --force
|
||||
|
||||
This will:
|
||||
|
||||
* Download the latest French and Dutch translations
|
||||
* Overwrite the local YAML files with Loco’s content
|
||||
* Keep everything consistent across the team
|
||||
|
||||
|
||||
Adding new translation keys (Developer workflow)
|
||||
================================================
|
||||
|
||||
1. Add a new key directly in the appropriate YAML file, for example::
|
||||
|
||||
chill-bundles/ChillPersonBundle/translations/messages.fr.yml
|
||||
|
||||
Example key::
|
||||
|
||||
person.form.submit: "Envoyer"
|
||||
|
||||
2. Add Dutch translation as well if you can (otherwise leave empty to be translated within Loco later)::
|
||||
|
||||
person.form.submit: "Verzenden"
|
||||
|
||||
3. Run a push to send the new key to Loco:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
symfony console translation:push loco --locales=fr --locales=nl --force
|
||||
|
||||
4. The key will now appear in Loco for translation management.
|
||||
|
||||
Note: English appears as “untranslated”, because it is merely the source language
|
||||
@@ -55,7 +55,6 @@
|
||||
"@tsconfig/node20": "^20.1.4",
|
||||
"@types/dompurify": "^3.0.5",
|
||||
"@types/leaflet": "^1.9.3",
|
||||
"@vueuse/core": "^13.9.0",
|
||||
"bootstrap-icons": "^1.11.3",
|
||||
"dropzone": "^5.7.6",
|
||||
"es6-promise": "^4.2.8",
|
||||
|
||||
@@ -2154,6 +2154,11 @@ parameters:
|
||||
count: 1
|
||||
path: src/Bundle/ChillMainBundle/Export/Formatter/SpreadSheetFormatter.php
|
||||
|
||||
-
|
||||
message: "#^Instanceof between string and DateTimeInterface will always evaluate to false\\.$#"
|
||||
count: 1
|
||||
path: src/Bundle/ChillMainBundle/Export/Formatter/SpreadsheetListFormatter.php
|
||||
|
||||
-
|
||||
message: "#^PHPDoc tag @var for property Chill\\\\MainBundle\\\\Export\\\\Helper\\\\ExportAddressHelper\\:\\:\\$unitNamesKeysCache contains unresolvable type\\.$#"
|
||||
count: 1
|
||||
|
||||
@@ -37,6 +37,9 @@ return static function (RectorConfig $rectorConfig): void {
|
||||
$rectorConfig->rule(Rector\TypeDeclaration\Rector\Class_\MergeDateTimePropertyTypeDeclarationRector::class);
|
||||
$rectorConfig->rule(Rector\TypeDeclaration\Rector\ClassMethod\AddReturnTypeDeclarationBasedOnParentClassMethodRector::class);
|
||||
|
||||
// upgrade chill exports
|
||||
$rectorConfig->rules([\Chill\Utils\Rector\Rector\ChillBundleAddNormalizationMethodsOnExportRector::class]);
|
||||
|
||||
// part of the symfony 54 rules
|
||||
$rectorConfig->rule(\Rector\Symfony\Symfony53\Rector\StaticPropertyFetch\KernelTestCaseContainerPropertyDeprecationRector::class);
|
||||
$rectorConfig->rule(\Rector\Symfony\Symfony60\Rector\MethodCall\GetHelperControllerToServiceRector::class);
|
||||
|
||||
@@ -382,7 +382,6 @@ final class ActivityController extends AbstractController
|
||||
|
||||
$entity = new Activity();
|
||||
$entity->setUser($this->security->getUser());
|
||||
$entity->addUser($this->security->getUser());
|
||||
|
||||
if ($person instanceof Person) {
|
||||
$entity->setPerson($person);
|
||||
|
||||
@@ -48,6 +48,28 @@ class ActivityReasonCategoryController extends AbstractController
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays a form to edit an existing ActivityReasonCategory entity.
|
||||
*/
|
||||
#[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreasoncategory/{id}/edit', name: 'chill_activity_activityreasoncategory_edit')]
|
||||
public function editAction(mixed $id)
|
||||
{
|
||||
$em = $this->managerRegistry->getManager();
|
||||
|
||||
$entity = $em->getRepository(ActivityReasonCategory::class)->find($id);
|
||||
|
||||
if (!$entity) {
|
||||
throw $this->createNotFoundException('Unable to find ActivityReasonCategory entity.');
|
||||
}
|
||||
|
||||
$editForm = $this->createEditForm($entity);
|
||||
|
||||
return $this->render('@ChillActivity/ActivityReasonCategory/edit.html.twig', [
|
||||
'entity' => $entity,
|
||||
'edit_form' => $editForm->createView(),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists all ActivityReasonCategory entities.
|
||||
*/
|
||||
@@ -78,10 +100,29 @@ class ActivityReasonCategoryController extends AbstractController
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds and displays a ActivityReasonCategory entity.
|
||||
*/
|
||||
#[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreasoncategory/{id}/show', name: 'chill_activity_activityreasoncategory_show')]
|
||||
public function showAction(mixed $id)
|
||||
{
|
||||
$em = $this->managerRegistry->getManager();
|
||||
|
||||
$entity = $em->getRepository(ActivityReasonCategory::class)->find($id);
|
||||
|
||||
if (!$entity) {
|
||||
throw $this->createNotFoundException('Unable to find ActivityReasonCategory entity.');
|
||||
}
|
||||
|
||||
return $this->render('@ChillActivity/ActivityReasonCategory/show.html.twig', [
|
||||
'entity' => $entity,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Edits an existing ActivityReasonCategory entity.
|
||||
*/
|
||||
#[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreasoncategory/{id}/update', name: 'chill_activity_activityreasoncategory_update')]
|
||||
#[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreasoncategory/{id}/update', name: 'chill_activity_activityreasoncategory_update', methods: ['POST', 'PUT'])]
|
||||
public function updateAction(Request $request, mixed $id)
|
||||
{
|
||||
$em = $this->managerRegistry->getManager();
|
||||
@@ -98,7 +139,7 @@ class ActivityReasonCategoryController extends AbstractController
|
||||
if ($editForm->isSubmitted() && $editForm->isValid()) {
|
||||
$em->flush();
|
||||
|
||||
return $this->redirectToRoute('chill_activity_activityreasoncategory', ['id' => $id]);
|
||||
return $this->redirectToRoute('chill_activity_activityreasoncategory_edit', ['id' => $id]);
|
||||
}
|
||||
|
||||
return $this->render('@ChillActivity/ActivityReasonCategory/edit.html.twig', [
|
||||
@@ -137,7 +178,7 @@ class ActivityReasonCategoryController extends AbstractController
|
||||
{
|
||||
$form = $this->createForm(ActivityReasonCategoryType::class, $entity, [
|
||||
'action' => $this->generateUrl('chill_activity_activityreasoncategory_update', ['id' => $entity->getId()]),
|
||||
'method' => 'POST',
|
||||
'method' => 'PUT',
|
||||
]);
|
||||
|
||||
$form->add('submit', SubmitType::class, ['label' => 'Update']);
|
||||
|
||||
@@ -17,6 +17,7 @@ use Chill\ActivityBundle\Repository\ActivityReasonRepository;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||
|
||||
/**
|
||||
* ActivityReason controller.
|
||||
@@ -49,6 +50,28 @@ class ActivityReasonController extends AbstractController
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays a form to edit an existing ActivityReason entity.
|
||||
*/
|
||||
#[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreason/{id}/edit', name: 'chill_activity_activityreason_edit')]
|
||||
public function editAction(mixed $id)
|
||||
{
|
||||
$em = $this->managerRegistry->getManager();
|
||||
|
||||
$entity = $em->getRepository(ActivityReason::class)->find($id);
|
||||
|
||||
if (null === $entity) {
|
||||
throw new NotFoundHttpException('Unable to find ActivityReason entity.');
|
||||
}
|
||||
|
||||
$editForm = $this->createEditForm($entity);
|
||||
|
||||
return $this->render('@ChillActivity/ActivityReason/edit.html.twig', [
|
||||
'entity' => $entity,
|
||||
'edit_form' => $editForm->createView(),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists all ActivityReason entities.
|
||||
*/
|
||||
@@ -79,10 +102,29 @@ class ActivityReasonController extends AbstractController
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds and displays a ActivityReason entity.
|
||||
*/
|
||||
#[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreason/{id}/show', name: 'chill_activity_activityreason_show')]
|
||||
public function showAction(mixed $id)
|
||||
{
|
||||
$em = $this->managerRegistry->getManager();
|
||||
|
||||
$entity = $em->getRepository(ActivityReason::class)->find($id);
|
||||
|
||||
if (!$entity) {
|
||||
throw $this->createNotFoundException('Unable to find ActivityReason entity.');
|
||||
}
|
||||
|
||||
return $this->render('@ChillActivity/ActivityReason/show.html.twig', [
|
||||
'entity' => $entity,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Edits an existing ActivityReason entity.
|
||||
*/
|
||||
#[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreason/{id}/update', name: 'chill_activity_activityreason_update')]
|
||||
#[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreason/{id}/update', name: 'chill_activity_activityreason_update', methods: ['POST', 'PUT'])]
|
||||
public function updateAction(Request $request, mixed $id)
|
||||
{
|
||||
$em = $this->managerRegistry->getManager();
|
||||
@@ -138,7 +180,7 @@ class ActivityReasonController extends AbstractController
|
||||
{
|
||||
$form = $this->createForm(ActivityReasonType::class, $entity, [
|
||||
'action' => $this->generateUrl('chill_activity_activityreason_update', ['id' => $entity->getId()]),
|
||||
'method' => 'POST',
|
||||
'method' => 'PUT',
|
||||
]);
|
||||
|
||||
$form->add('submit', SubmitType::class, ['label' => 'Update']);
|
||||
|
||||
@@ -66,9 +66,6 @@ class ListActivityHelper
|
||||
->leftJoin('activity.location', 'location')
|
||||
->addSelect('location.name AS locationName')
|
||||
->addSelect('activity.sentReceived')
|
||||
->addSelect('activity.comment.comment AS commentText')
|
||||
->addSelect('activity.comment.date AS commentDate')
|
||||
->addSelect('JSON_BUILD_OBJECT(\'uid\', activity.comment.userId, \'d\', activity.comment.date) AS commentUser')
|
||||
->addSelect('JSON_BUILD_OBJECT(\'uid\', IDENTITY(activity.createdBy), \'d\', activity.createdAt) AS createdBy')
|
||||
->addSelect('activity.createdAt')
|
||||
->addSelect('JSON_BUILD_OBJECT(\'uid\', IDENTITY(activity.updatedBy), \'d\', activity.updatedAt) AS updatedBy')
|
||||
@@ -90,8 +87,6 @@ class ListActivityHelper
|
||||
'createdAt', 'updatedAt' => $this->dateTimeHelper->getLabel($key),
|
||||
'createdBy', 'updatedBy' => $this->userHelper->getLabel($key, $values, $key),
|
||||
'date' => $this->dateTimeHelper->getLabel(self::MSG_KEY.$key),
|
||||
'commentDate' => $this->dateTimeHelper->getLabel(self::MSG_KEY.'comment_date'),
|
||||
'commentUser' => $this->userHelper->getLabel($key, $values, self::MSG_KEY.'comment_user'),
|
||||
'attendeeName' => function ($value) {
|
||||
if ('_header' === $value) {
|
||||
return 'Attendee';
|
||||
@@ -181,9 +176,6 @@ class ListActivityHelper
|
||||
'usersNames',
|
||||
'thirdPartiesIds',
|
||||
'thirdPartiesNames',
|
||||
'commentText',
|
||||
'commentDate',
|
||||
'commentUser',
|
||||
'createdBy',
|
||||
'createdAt',
|
||||
'updatedBy',
|
||||
|
||||
@@ -90,9 +90,7 @@ class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInt
|
||||
|
||||
public function getFormDefaultData(): array
|
||||
{
|
||||
return [
|
||||
'reasons' => [],
|
||||
];
|
||||
return [];
|
||||
}
|
||||
|
||||
public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array
|
||||
|
||||
@@ -42,8 +42,6 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem
|
||||
|
||||
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void
|
||||
{
|
||||
error_log('alterQuery called with data: '.json_encode(array_keys($data)));
|
||||
|
||||
// create a subquery for activity
|
||||
$sqb = $qb->getEntityManager()->createQueryBuilder();
|
||||
$sqb->select('1')
|
||||
@@ -61,6 +59,7 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem
|
||||
if (\in_array('activity', $qb->getAllAliases(), true)) {
|
||||
$sqb->andWhere('activity_person_having_activity.id = activity.id');
|
||||
}
|
||||
|
||||
if (isset($data['reasons']) && [] !== $data['reasons']) {
|
||||
// add clause activity reason
|
||||
$sqb->join('activity_person_having_activity.reasons', 'reasons_person_having_activity');
|
||||
@@ -125,38 +124,12 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem
|
||||
|
||||
public function normalizeFormData(array $formData): array
|
||||
{
|
||||
$normalized = [
|
||||
'date_from_rolling' => $formData['date_from_rolling']->normalize(),
|
||||
'date_to_rolling' => $formData['date_to_rolling']->normalize(),
|
||||
'reasons' => [],
|
||||
];
|
||||
|
||||
if (isset($formData['reasons']) && [] !== $formData['reasons']) {
|
||||
$normalized['reasons'] = array_map(
|
||||
fn (ActivityReason $reason) => $reason->getId(),
|
||||
$formData['reasons']
|
||||
);
|
||||
}
|
||||
|
||||
return $normalized;
|
||||
return ['date_from_rolling' => $formData['date_from_rolling']->normalize(), 'date_to_rolling' => $formData['date_to_rolling']->normalize()];
|
||||
}
|
||||
|
||||
public function denormalizeFormData(array $formData, int $fromVersion): array
|
||||
{
|
||||
$denormalized = [
|
||||
'date_from_rolling' => RollingDate::fromNormalized($formData['date_from_rolling']),
|
||||
'date_to_rolling' => RollingDate::fromNormalized($formData['date_to_rolling']),
|
||||
'reasons' => [],
|
||||
];
|
||||
|
||||
if (isset($formData['reasons']) && [] !== $formData['reasons']) {
|
||||
$denormalized['reasons'] = array_map(
|
||||
fn ($id) => $this->activityReasonRepository->find($id),
|
||||
$formData['reasons']
|
||||
);
|
||||
}
|
||||
|
||||
return $denormalized;
|
||||
return ['date_from_rolling' => RollingDate::fromNormalized($formData['date_from_rolling']), 'date_to_rolling' => RollingDate::fromNormalized($formData['date_to_rolling'])];
|
||||
}
|
||||
|
||||
public function getFormDefaultData(): array
|
||||
@@ -170,12 +143,10 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem
|
||||
|
||||
public function describeAction($data, ExportGenerationContext $context): array
|
||||
{
|
||||
$reasons = $data['reasons'] ?? [];
|
||||
|
||||
return [
|
||||
[] === $reasons ?
|
||||
'export.filter.activity.describe_action_with_no_subject'
|
||||
: 'export.filter.activity.describe_action_with_subject',
|
||||
[] === $data['reasons'] ?
|
||||
'export.filter.person_between_dates.describe_action_with_no_subject'
|
||||
: 'export.filter.person_between_dates.describe_action_with_subject',
|
||||
[
|
||||
'date_from' => $this->rollingDateConverter->convert($data['date_from_rolling']),
|
||||
'date_to' => $this->rollingDateConverter->convert($data['date_to_rolling']),
|
||||
@@ -183,7 +154,7 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem
|
||||
', ',
|
||||
array_map(
|
||||
fn (ActivityReason $r): string => '"'.$this->translatableStringHelper->localize($r->getName()).'"',
|
||||
$reasons
|
||||
$data['reasons']
|
||||
)
|
||||
),
|
||||
],
|
||||
@@ -197,7 +168,6 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem
|
||||
|
||||
public function validateForm($data, ExecutionContextInterface $context): void
|
||||
{
|
||||
error_log('validateForm called with data: '.json_encode(array_keys($data)));
|
||||
if ($this->rollingDateConverter->convert($data['date_from_rolling'])
|
||||
>= $this->rollingDateConverter->convert($data['date_to_rolling'])) {
|
||||
$context->buildViolation('export.filter.activity.person_between_dates.date mismatch')
|
||||
|
||||
@@ -88,8 +88,8 @@ class ActivityType extends AbstractType
|
||||
|
||||
if (null !== $options['data']->getPerson()) {
|
||||
$builder->add('scope', ScopePickerType::class, [
|
||||
'role' => ActivityVoter::CREATE === (string) $options['role'] ? ActivityVoter::CREATE_PERSON : (string) $options['role'],
|
||||
'center' => $options['center'],
|
||||
'role' => ActivityVoter::CREATE === (string) $options['role'] ? ActivityVoter::CREATE_PERSON : (string) $options['role'],
|
||||
'required' => true,
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -136,14 +136,8 @@ export default {
|
||||
issueIsLoading: false,
|
||||
actionIsLoading: false,
|
||||
actionAreLoaded: false,
|
||||
socialIssuesClassList: {
|
||||
"col-form-label": true,
|
||||
required: false,
|
||||
},
|
||||
socialActionsClassList: {
|
||||
"col-form-label": true,
|
||||
required: false,
|
||||
},
|
||||
socialIssuesClassList: `col-form-label ${document.querySelector("input#chill_activitybundle_activity_socialIssues").getAttribute("required") ? "required" : ""}`,
|
||||
socialActionsClassList: `col-form-label ${document.querySelector("input#chill_activitybundle_activity_socialActions").getAttribute("required") ? "required" : ""}`,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
@@ -164,21 +158,6 @@ export default {
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
/* Load classNames after element is present */
|
||||
const socialActionsEl = document.querySelector(
|
||||
"input#chill_activitybundle_activity_socialActions",
|
||||
);
|
||||
if (socialActionsEl && socialActionsEl.hasAttribute("required")) {
|
||||
this.socialActionsClassList.required = true;
|
||||
}
|
||||
|
||||
const socialIssuesEl = document.querySelector(
|
||||
"input#chill_activitybundle_activity_socialIssues",
|
||||
);
|
||||
if (socialIssuesEl && socialIssuesEl.hasAttribute("required")) {
|
||||
this.socialIssuesClassList.required = true;
|
||||
}
|
||||
|
||||
/* Load other issues in multiselect */
|
||||
this.issueIsLoading = true;
|
||||
this.actionAreLoaded = false;
|
||||
|
||||
@@ -43,23 +43,11 @@ export default {
|
||||
span.badge {
|
||||
@include badge_social($social-action-color);
|
||||
font-size: 95%;
|
||||
white-space: normal;
|
||||
word-wrap: break-word;
|
||||
word-break: break-word;
|
||||
display: inline-block;
|
||||
max-width: 100%;
|
||||
margin-bottom: 5px;
|
||||
margin-right: 1em;
|
||||
text-align: left;
|
||||
line-height: 1.2em;
|
||||
|
||||
&::before {
|
||||
position: absolute;
|
||||
left: 11px;
|
||||
top: 0;
|
||||
margin: 0 0.3em 0 -0.75em;
|
||||
}
|
||||
position: relative;
|
||||
padding-left: 1.5em;
|
||||
max-width: 100%; /* Adjust as needed */
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -43,22 +43,7 @@ export default {
|
||||
span.badge {
|
||||
@include badge_social($social-issue-color);
|
||||
font-size: 95%;
|
||||
white-space: normal;
|
||||
word-wrap: break-word;
|
||||
word-break: break-word;
|
||||
display: inline-block;
|
||||
max-width: 100%;
|
||||
margin-bottom: 5px;
|
||||
margin-right: 1em;
|
||||
text-align: left;
|
||||
|
||||
&::before {
|
||||
position: absolute;
|
||||
left: 11px;
|
||||
top: 0;
|
||||
margin: 0 0.3em 0 -0.75em;
|
||||
}
|
||||
position: relative;
|
||||
padding-left: 1.5em;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -369,7 +369,7 @@ const store = createStore({
|
||||
// console.log('works', works);
|
||||
commit("setAccompanyingPeriodWorks", works);
|
||||
} catch (error) {
|
||||
console.error("Failed to fetch works:", error);
|
||||
console.error('Failed to fetch works:', error);
|
||||
}
|
||||
},
|
||||
getWhoAmI({ commit }) {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{% block admin_content %}
|
||||
<h1>{{ 'ActivityReason list'|trans }}</h1>
|
||||
|
||||
<table class="table table-bordered border-dark align-middle">
|
||||
<table class="records_list">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{ 'Name'|trans }}</th>
|
||||
@@ -29,7 +29,10 @@
|
||||
<td>
|
||||
<ul class="record_actions">
|
||||
<li>
|
||||
<a href="{{ path('chill_activity_activityreason_update', { 'id': entity.id }) }}" class="btn btn-edit" title="{{ 'edit'|trans }}"></a>
|
||||
<a href="{{ path('chill_activity_activityreason_show', { 'id': entity.id }) }}" class="btn btn-show" title="{{ 'show'|trans }}"></a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{ path('chill_activity_activityreason_edit', { 'id': entity.id }) }}" class="btn btn-edit" title="{{ 'edit'|trans }}"></a>
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{% block admin_content %}
|
||||
<h1>{{ 'ActivityReasonCategory list'|trans }}</h1>
|
||||
|
||||
<table class="table table-bordered border-dark align-middle">
|
||||
<table class="records_list">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{ 'Name'|trans }}</th>
|
||||
@@ -23,7 +23,10 @@
|
||||
<td>
|
||||
<ul class="record_actions">
|
||||
<li>
|
||||
<a href="{{ path('chill_activity_activityreasoncategory_update', { 'id': entity.id }) }}" class="btn btn-edit" title="{{ 'edit'|trans }}"></a>
|
||||
<a href="{{ path('chill_activity_activityreasoncategory_show', { 'id': entity.id }) }}" class="btn btn-show" title="{{ 'show'|trans }}"></a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{ path('chill_activity_activityreasoncategory_edit', { 'id': entity.id }) }}" class="btn btn-edit" title="{{ 'edit'|trans }}"></a>
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
|
||||
@@ -22,52 +22,6 @@ use Symfony\Component\Security\Core\Role\Role;
|
||||
*/
|
||||
final class ActivityControllerTest extends WebTestCase
|
||||
{
|
||||
/**
|
||||
* @dataProvider getSecuredPagesUnauthenticated
|
||||
*/
|
||||
public function testAccessIsDeniedForUnauthenticated(mixed $url)
|
||||
{
|
||||
$client = $this->createClient();
|
||||
|
||||
$client->request('GET', $url);
|
||||
|
||||
$this->assertEquals(302, $client->getResponse()->getStatusCode());
|
||||
$this->assertTrue(
|
||||
$client->getResponse()->isRedirect('http://localhost/login'),
|
||||
sprintf('the page "%s" does not redirect to http://localhost/login', $url)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide a client unauthenticated and.
|
||||
*/
|
||||
public function getSecuredPagesUnauthenticated()
|
||||
{
|
||||
self::bootKernel();
|
||||
$person = $this->getPersonFromFixtures();
|
||||
$activities = $this->getActivitiesForPerson($person);
|
||||
|
||||
return [
|
||||
[sprintf('fr/person/%d/activity/', $person->getId())],
|
||||
[sprintf('fr/person/%d/activity/new', $person->getId())],
|
||||
[sprintf('fr/person/%d/activity/%d/show', $person->getId(), $activities[0]->getId())],
|
||||
[sprintf('fr/person/%d/activity/%d/edit', $person->getId(), $activities[0]->getId())],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getSecuredPagesAuthenticated
|
||||
*
|
||||
* @param type $client
|
||||
* @param type $url
|
||||
*/
|
||||
public function testAccessIsDeniedForUnauthorized($client, $url)
|
||||
{
|
||||
$client->request('GET', $url);
|
||||
|
||||
$this->assertEquals(403, $client->getResponse()->getStatusCode());
|
||||
}
|
||||
|
||||
public function getSecuredPagesAuthenticated()
|
||||
{
|
||||
self::bootKernel();
|
||||
@@ -101,6 +55,52 @@ final class ActivityControllerTest extends WebTestCase
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide a client unauthenticated and.
|
||||
*/
|
||||
public function getSecuredPagesUnauthenticated()
|
||||
{
|
||||
self::bootKernel();
|
||||
$person = $this->getPersonFromFixtures();
|
||||
$activities = $this->getActivitiesForPerson($person);
|
||||
|
||||
return [
|
||||
[sprintf('fr/person/%d/activity/', $person->getId())],
|
||||
[sprintf('fr/person/%d/activity/new', $person->getId())],
|
||||
[sprintf('fr/person/%d/activity/%d/show', $person->getId(), $activities[0]->getId())],
|
||||
[sprintf('fr/person/%d/activity/%d/edit', $person->getId(), $activities[0]->getId())],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getSecuredPagesUnauthenticated
|
||||
*/
|
||||
public function testAccessIsDeniedForUnauthenticated(mixed $url)
|
||||
{
|
||||
$client = $this->createClient();
|
||||
|
||||
$client->request('GET', $url);
|
||||
|
||||
$this->assertEquals(302, $client->getResponse()->getStatusCode());
|
||||
$this->assertTrue(
|
||||
$client->getResponse()->isRedirect('http://localhost/login'),
|
||||
sprintf('the page "%s" does not redirect to http://localhost/login', $url)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getSecuredPagesAuthenticated
|
||||
*
|
||||
* @param type $client
|
||||
* @param type $url
|
||||
*/
|
||||
public function testAccessIsDeniedForUnauthorized($client, $url)
|
||||
{
|
||||
$client->request('GET', $url);
|
||||
|
||||
$this->assertEquals(403, $client->getResponse()->getStatusCode());
|
||||
}
|
||||
|
||||
public function testCompleteScenario()
|
||||
{
|
||||
// Create a new client to browse the application
|
||||
|
||||
@@ -137,64 +137,6 @@ class ActivityACLAwareRepositoryTest extends KernelTestCase
|
||||
self::assertIsArray($actual);
|
||||
}
|
||||
|
||||
public function provideDataFindByAccompanyingPeriod(): iterable
|
||||
{
|
||||
$this->setUp();
|
||||
|
||||
if (null === $period = $this->entityManager
|
||||
->createQueryBuilder()
|
||||
->select('a')
|
||||
->from(AccompanyingPeriod::class, 'a')
|
||||
->setMaxResults(1)
|
||||
->getQuery()
|
||||
->getSingleResult()) {
|
||||
throw new \RuntimeException('no period found');
|
||||
}
|
||||
|
||||
if ([] === $types = $this->entityManager
|
||||
->createQueryBuilder()
|
||||
->select('t')
|
||||
->from(ActivityType::class, 't')
|
||||
->setMaxResults(2)
|
||||
->getQuery()
|
||||
->getResult()) {
|
||||
throw new \RuntimeException('no types');
|
||||
}
|
||||
|
||||
if ([] === $jobs = $this->entityManager
|
||||
->createQueryBuilder()
|
||||
->select('j')
|
||||
->from(UserJob::class, 'j')
|
||||
->setMaxResults(2)
|
||||
->getQuery()
|
||||
->getResult()
|
||||
) {
|
||||
$job = new UserJob();
|
||||
$job->setLabel(['fr' => 'test']);
|
||||
$this->entityManager->persist($job);
|
||||
$this->entityManager->flush();
|
||||
}
|
||||
|
||||
if (null === $user = $this->entityManager
|
||||
->createQueryBuilder()
|
||||
->select('u')
|
||||
->from(User::class, 'u')
|
||||
->setMaxResults(1)
|
||||
->getQuery()
|
||||
->getSingleResult()
|
||||
) {
|
||||
throw new \RuntimeException('no user found');
|
||||
}
|
||||
|
||||
yield [$period, $user, ActivityVoter::SEE, 0, 10, ['date' => 'DESC'], []];
|
||||
yield [$period, $user, ActivityVoter::SEE, 0, 10, ['date' => 'DESC'], ['my_activities' => true]];
|
||||
yield [$period, $user, ActivityVoter::SEE, 0, 10, ['date' => 'DESC'], ['types' => $types]];
|
||||
yield [$period, $user, ActivityVoter::SEE, 0, 10, ['date' => 'DESC'], ['jobs' => $jobs]];
|
||||
yield [$period, $user, ActivityVoter::SEE, 0, 10, ['date' => 'DESC'], ['after' => new \DateTimeImmutable('1 year ago')]];
|
||||
yield [$period, $user, ActivityVoter::SEE, 0, 10, ['date' => 'DESC'], ['before' => new \DateTimeImmutable('1 year ago')]];
|
||||
yield [$period, $user, ActivityVoter::SEE, 0, 10, ['date' => 'DESC'], ['after' => new \DateTimeImmutable('1 year ago'), 'before' => new \DateTimeImmutable('1 month ago')]];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider provideDataFindByPerson
|
||||
*/
|
||||
@@ -349,4 +291,62 @@ class ActivityACLAwareRepositoryTest extends KernelTestCase
|
||||
yield [$person, $user, $centers, $scopes, ActivityVoter::SEE, 0, 5, ['date' => 'DESC'], ['before' => new \DateTimeImmutable('1 year ago')]];
|
||||
yield [$person, $user, $centers, $scopes, ActivityVoter::SEE, 0, 5, ['date' => 'DESC'], ['after' => new \DateTimeImmutable('1 year ago'), 'before' => new \DateTimeImmutable('1 month ago')]];
|
||||
}
|
||||
|
||||
public function provideDataFindByAccompanyingPeriod(): iterable
|
||||
{
|
||||
$this->setUp();
|
||||
|
||||
if (null === $period = $this->entityManager
|
||||
->createQueryBuilder()
|
||||
->select('a')
|
||||
->from(AccompanyingPeriod::class, 'a')
|
||||
->setMaxResults(1)
|
||||
->getQuery()
|
||||
->getSingleResult()) {
|
||||
throw new \RuntimeException('no period found');
|
||||
}
|
||||
|
||||
if ([] === $types = $this->entityManager
|
||||
->createQueryBuilder()
|
||||
->select('t')
|
||||
->from(ActivityType::class, 't')
|
||||
->setMaxResults(2)
|
||||
->getQuery()
|
||||
->getResult()) {
|
||||
throw new \RuntimeException('no types');
|
||||
}
|
||||
|
||||
if ([] === $jobs = $this->entityManager
|
||||
->createQueryBuilder()
|
||||
->select('j')
|
||||
->from(UserJob::class, 'j')
|
||||
->setMaxResults(2)
|
||||
->getQuery()
|
||||
->getResult()
|
||||
) {
|
||||
$job = new UserJob();
|
||||
$job->setLabel(['fr' => 'test']);
|
||||
$this->entityManager->persist($job);
|
||||
$this->entityManager->flush();
|
||||
}
|
||||
|
||||
if (null === $user = $this->entityManager
|
||||
->createQueryBuilder()
|
||||
->select('u')
|
||||
->from(User::class, 'u')
|
||||
->setMaxResults(1)
|
||||
->getQuery()
|
||||
->getSingleResult()
|
||||
) {
|
||||
throw new \RuntimeException('no user found');
|
||||
}
|
||||
|
||||
yield [$period, $user, ActivityVoter::SEE, 0, 10, ['date' => 'DESC'], []];
|
||||
yield [$period, $user, ActivityVoter::SEE, 0, 10, ['date' => 'DESC'], ['my_activities' => true]];
|
||||
yield [$period, $user, ActivityVoter::SEE, 0, 10, ['date' => 'DESC'], ['types' => $types]];
|
||||
yield [$period, $user, ActivityVoter::SEE, 0, 10, ['date' => 'DESC'], ['jobs' => $jobs]];
|
||||
yield [$period, $user, ActivityVoter::SEE, 0, 10, ['date' => 'DESC'], ['after' => new \DateTimeImmutable('1 year ago')]];
|
||||
yield [$period, $user, ActivityVoter::SEE, 0, 10, ['date' => 'DESC'], ['before' => new \DateTimeImmutable('1 year ago')]];
|
||||
yield [$period, $user, ActivityVoter::SEE, 0, 10, ['date' => 'DESC'], ['after' => new \DateTimeImmutable('1 year ago'), 'before' => new \DateTimeImmutable('1 month ago')]];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,46 +57,6 @@ final class ActivityVoterTest extends KernelTestCase
|
||||
$this->prophet = new \Prophecy\Prophet();
|
||||
}
|
||||
|
||||
public function testNullUser()
|
||||
{
|
||||
$token = $this->prepareToken();
|
||||
$center = $this->prepareCenter(1, 'center');
|
||||
$person = $this->preparePerson($center);
|
||||
$scope = $this->prepareScope(1, 'default');
|
||||
$activity = $this->prepareActivity($scope, $person);
|
||||
|
||||
$this->assertEquals(
|
||||
VoterInterface::ACCESS_DENIED,
|
||||
$this->voter->vote($token, $activity, ['CHILL_ACTIVITY_SEE']),
|
||||
'assert that a null user is not allowed to see'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataProvider_testVoteAction
|
||||
*
|
||||
* @param type $expectedResult
|
||||
* @param string $attribute
|
||||
* @param string $message
|
||||
*/
|
||||
public function testVoteAction(
|
||||
$expectedResult,
|
||||
User $user,
|
||||
Scope $scope,
|
||||
Center $center,
|
||||
$attribute,
|
||||
$message,
|
||||
) {
|
||||
$token = $this->prepareToken($user);
|
||||
$activity = $this->prepareActivity($scope, $this->preparePerson($center));
|
||||
|
||||
$this->assertEquals(
|
||||
$expectedResult,
|
||||
$this->voter->vote($token, $activity, [$attribute]),
|
||||
$message
|
||||
);
|
||||
}
|
||||
|
||||
public function dataProvider_testVoteAction()
|
||||
{
|
||||
$centerA = $this->prepareCenter(1, 'center A');
|
||||
@@ -150,6 +110,46 @@ final class ActivityVoterTest extends KernelTestCase
|
||||
];
|
||||
}
|
||||
|
||||
public function testNullUser()
|
||||
{
|
||||
$token = $this->prepareToken();
|
||||
$center = $this->prepareCenter(1, 'center');
|
||||
$person = $this->preparePerson($center);
|
||||
$scope = $this->prepareScope(1, 'default');
|
||||
$activity = $this->prepareActivity($scope, $person);
|
||||
|
||||
$this->assertEquals(
|
||||
VoterInterface::ACCESS_DENIED,
|
||||
$this->voter->vote($token, $activity, ['CHILL_ACTIVITY_SEE']),
|
||||
'assert that a null user is not allowed to see'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataProvider_testVoteAction
|
||||
*
|
||||
* @param type $expectedResult
|
||||
* @param string $attribute
|
||||
* @param string $message
|
||||
*/
|
||||
public function testVoteAction(
|
||||
$expectedResult,
|
||||
User $user,
|
||||
Scope $scope,
|
||||
Center $center,
|
||||
$attribute,
|
||||
$message,
|
||||
) {
|
||||
$token = $this->prepareToken($user);
|
||||
$activity = $this->prepareActivity($scope, $this->preparePerson($center));
|
||||
|
||||
$this->assertEquals(
|
||||
$expectedResult,
|
||||
$this->voter->vote($token, $activity, [$attribute]),
|
||||
$message
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* prepare a token interface with correct rights.
|
||||
*
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
namespace Chill\Migrations\Activity;
|
||||
|
||||
use Doctrine\DBAL\Schema\Schema;
|
||||
use Doctrine\Migrations\AbstractMigration;
|
||||
|
||||
/**
|
||||
* Migration fixing the automatic association of users to activities (exchanges).
|
||||
*
|
||||
* Originally, the user who created an exchange was not automatically associated
|
||||
* to it (the "TMS" column), which led to incomplete data and biased statistics.
|
||||
*
|
||||
* This migration:
|
||||
* - retroactively associates the creator of each exchange to the corresponding
|
||||
* activity;
|
||||
* - flags these backfilled associations with a temporary column so it is clear
|
||||
* they were added by this data correction and can be safely cleaned up later.
|
||||
*/
|
||||
final class Version20251118124241 extends AbstractMigration
|
||||
{
|
||||
public function getDescription(): string
|
||||
{
|
||||
return 'Insert the creator of activity into the activity_user table';
|
||||
}
|
||||
|
||||
public function up(Schema $schema): void
|
||||
{
|
||||
$this->addSql('ALTER TABLE activity_user ADD COLUMN by_migration BOOL DEFAULT FALSE');
|
||||
$this->addSql("COMMENT ON COLUMN activity_user.by_migration IS 'For backup purpose - can be safely deleted after a while. See migration \\Chill\\Migrations\\Activity\\Version20251118124241'");
|
||||
|
||||
$this->addSql('INSERT INTO activity_user (activity_id, user_id, by_migration)
|
||||
SELECT id, user_id, true FROM activity
|
||||
ON CONFLICT DO NOTHING');
|
||||
}
|
||||
|
||||
public function down(Schema $schema): void
|
||||
{
|
||||
$this->addSql('ALTER TABLE activity_user DROP COLUMN by_migration');
|
||||
}
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
export:
|
||||
filter:
|
||||
activity:
|
||||
course_having_activity_between_date:
|
||||
Only course having an activity between from and to: Alleen trajecten met een activiteit tussen {from, date, short} en {to, date, short}
|
||||
|
||||
acp_by_activity_type:
|
||||
'acp_containing_at_least_one_activitytypes': >-
|
||||
Gefilterde trajecten: alleen die welke ten minste één activiteit bevatten van een van de volgende types: {activitytypes}
|
||||
{has_date_after, select, 1 {, na {date_after, date}} other {}}
|
||||
{has_date_before, select, 1 {, voor {date_before, date}} other {}}
|
||||
describe_action_with_no_subject: >-
|
||||
Gefilterd op persoon die een activiteit had tussen {date_from, date} en {date_to, date}
|
||||
describe_action_with_subject: >-
|
||||
Gefilterd op persoon die een activiteit had tussen {date_from, date} en {date_to, date}, en een van deze gekozen onderwerpen: {reasons}
|
||||
|
||||
activity:
|
||||
title: Activiteit van {date, date, long} - {type}
|
||||
@@ -10,7 +10,7 @@ Attendee: Présence de l'usager
|
||||
attendee: présence de l'usager
|
||||
list_reasons: liste des sujets
|
||||
user_username: nom de l'utilisateur
|
||||
circle_name: nom du service
|
||||
circle_name: nom du cercle
|
||||
Remark: Commentaire
|
||||
No comments: Aucun commentaire
|
||||
Add a new activity: Ajouter une nouvel échange
|
||||
@@ -20,7 +20,7 @@ not present: absent
|
||||
Delete: Supprimer
|
||||
Update: Mettre à jour
|
||||
Update activity: Modifier l'échange
|
||||
Scope: Service
|
||||
Scope: Cercle
|
||||
Activity data: Données de l'échange
|
||||
Activity location: Localisation de l'échange
|
||||
No reason associated: Aucun sujet
|
||||
@@ -398,15 +398,13 @@ export:
|
||||
sent received: Envoyé ou reçu
|
||||
emergency: Urgence
|
||||
accompanying course id: Identifiant du parcours
|
||||
course circles: Services du parcours
|
||||
course circles: Cercles du parcours
|
||||
travelTime: Durée de déplacement
|
||||
durationTime: Durée
|
||||
id: Identifiant
|
||||
List activities linked to an accompanying course: Liste les échanges liés à un parcours en fonction de différents filtres.
|
||||
List activity linked to a course: Liste des échanges liés à un parcours
|
||||
commentText: Commentaire
|
||||
comment_date: Date de la dernière édition du commentaire
|
||||
comment_user: Dernière édition par
|
||||
|
||||
|
||||
filter:
|
||||
activity:
|
||||
|
||||
@@ -1,500 +1,234 @@
|
||||
#general
|
||||
Show the activity: Uitwisseling bekijken
|
||||
Edit the activity: Uitwisseling bewerken
|
||||
Activity: Uitwisseling
|
||||
Show the activity: Toon activiteit
|
||||
Edit the activity: Wijzig activiteit
|
||||
Activity: Activiteit
|
||||
Duration time: Duur
|
||||
Duration Time: Duur
|
||||
durationTime: duur
|
||||
Travel time: Reisduur
|
||||
Attendee: Aanwezigheid van de gebruiker
|
||||
attendee: aanwezigheid van de gebruiker
|
||||
list_reasons: lijst van onderwerpen
|
||||
user_username: naam van de gebruiker
|
||||
circle_name: naam van de dienst
|
||||
Travel time: Duur van verplaatsing
|
||||
Attendee: Aanwezigheden
|
||||
attendee: aanwezigheden
|
||||
list_reasons: Onderwerpen
|
||||
user_username: gebruikersnaam
|
||||
circle_name: naam kring
|
||||
Remark: Opmerking
|
||||
No comments: Geen opmerking
|
||||
Add a new activity: Nieuwe uitwisseling toevoegen
|
||||
Activity list: Lijst van uitwisselingen
|
||||
No comments: Geen opmerkingen
|
||||
Add a new activity: Voeg een nieuwe activiteit toe
|
||||
Activity list: Lijst van activiteiten
|
||||
present: aanwezig
|
||||
not present: afwezig
|
||||
Delete: Verwijderen
|
||||
Update: Bijwerken
|
||||
Update activity: Uitwisseling bewerken
|
||||
Scope: Dienst
|
||||
Activity data: Gegevens van de uitwisseling
|
||||
Activity location: Locatie van de uitwisseling
|
||||
Update activity: Activieit bijwerken
|
||||
Scope: Werkingsgebied
|
||||
Activity data: Gegevens activiteit
|
||||
Activity location: Locatie activiteit
|
||||
No reason associated: Geen onderwerp
|
||||
No social issues associated: Geen sociale problematiek
|
||||
No social actions associated: Geen begeleidingsactie
|
||||
There isn't any activities.: Geen uitwisseling geregistreerd.
|
||||
type_name: type van de uitwisseling
|
||||
No social issues associated: Geen sociaal vraagstuk
|
||||
No social actions associated: Geen maatschappelijke actie
|
||||
There isn't any activities.: Er zijn geen activiteiten
|
||||
type_name: Soort activiteit
|
||||
person_firstname: voornaam
|
||||
person_lastname: achternaam
|
||||
person_id: identificatie van de gebruiker
|
||||
Type: Type
|
||||
person_lastname: familienaam
|
||||
person_id: Identificatienummer persoon
|
||||
Type: Soort
|
||||
Invisible: Onzichtbaar
|
||||
Optional: Optioneel
|
||||
Required: Verplicht
|
||||
Persons: Gebruikers
|
||||
Persons: Personen
|
||||
Users: Gebruikers
|
||||
Emergency: Urgent
|
||||
Emergency: Dringend
|
||||
Sent received: Inkomend / Uitgaand
|
||||
Sent: Verzenden
|
||||
Received: Ontvangen
|
||||
by: 'Door '
|
||||
location: Plaats
|
||||
Reasons: Onderwerpen
|
||||
Private comment: Privé opmerking
|
||||
sent: Verzonden
|
||||
received: Ontvangen
|
||||
|
||||
|
||||
#forms
|
||||
Activity creation: Nieuwe uitwisseling
|
||||
Create: Aanmaken
|
||||
Back to the list: Terug naar de lijst
|
||||
Save activity: Uitwisseling opslaan
|
||||
Reset form: Formulier resetten
|
||||
Choose the duration: Duur kiezen
|
||||
Choose a type: Type kiezen
|
||||
5 minutes: 5 minuten
|
||||
10 minutes: 10 minuten
|
||||
15 minutes: 15 minuten
|
||||
20 minutes: 20 minuten
|
||||
25 minutes: 25 minuten
|
||||
30 minutes: 30 minuten
|
||||
45 minutes: 45 minuten
|
||||
1 hour: 1 uur
|
||||
1 hour 15: 1 uur 15
|
||||
1 hour 30: 1 uur 30
|
||||
1 hour 45: 1 uur 45
|
||||
2 hours: 2 uur
|
||||
2 hours 15: 2 uur 15
|
||||
2 hours 30: 2 uur 30
|
||||
2 hours 45: 2 uur 45
|
||||
3 hours: 3 uur
|
||||
3 hours 30: 3 uur 30
|
||||
4 hours: 4 uur
|
||||
4 hours 30: 4 uur 30
|
||||
5 hours: 5 uur
|
||||
5 hours 30: 5 uur 30
|
||||
6 hours: 6 uur
|
||||
6 hours 30: 6 uur 30
|
||||
7 hours: 7 uur
|
||||
7 hours 30: 7 uur 30
|
||||
8 hours: 8 uur
|
||||
8 hours 30: 8 uur 30
|
||||
9 hours: 9 uur
|
||||
9 hours 30: 9 uur 30
|
||||
10 hours: 10 uur
|
||||
11 hours: 11 uur
|
||||
12 hours: 12 uur
|
||||
Concerned groups: Betrokken partijen bij de uitwisseling
|
||||
Persons in accompanying course: Gebruikers van het traject
|
||||
Third persons: Niet-prof. derden
|
||||
Others persons: Gebruikers
|
||||
Third parties: Professionele derden
|
||||
Activity creation: Nouvel échange
|
||||
Create: Créer
|
||||
Back to the list: Retour à la liste
|
||||
Save activity: Sauver l'échange
|
||||
Reset form: Remise à zéro du formulaire
|
||||
Choose the duration: Choisir la durée
|
||||
Choose a type: Choisir un type
|
||||
5 minutes: 5 minutes
|
||||
10 minutes: 10 minutes
|
||||
15 minutes: 15 minutes
|
||||
20 minutes: 20 minutes
|
||||
25 minutes: 25 minutes
|
||||
30 minutes: 30 minutes
|
||||
45 minutes: 45 minutes
|
||||
1 hour: 1 heure
|
||||
1 hour 15: 1 heure 15
|
||||
1 hour 30: 1 heure 30
|
||||
1 hour 45: 1 heure 45
|
||||
2 hours: 2 heures
|
||||
Concerned groups: Parties concernées
|
||||
Persons in accompanying course: Usagers du parcours
|
||||
Third persons: Tiers non-pro.
|
||||
Others persons: Usagers
|
||||
Third parties: Tiers professionnels
|
||||
Users concerned: T(M)S
|
||||
|
||||
activity:
|
||||
date: Datum van de uitwisseling
|
||||
Insert a document: Document invoegen
|
||||
Remove a document: Document verwijderen
|
||||
comment: Opmerking
|
||||
deleted: Uitwisseling verwijderd
|
||||
|
||||
errors: Het formulier bevat fouten
|
||||
social_issues: Sociale problematieken
|
||||
choose_other_social_issue: Andere sociale problematiek toevoegen...
|
||||
social_actions: Begeleidingsacties
|
||||
select_first_a_social_issue: Selecteer eerst een sociale problematiek
|
||||
social_action_list_empty: Geen sociale actie beschikbaar
|
||||
add_persons: Betrokken personen toevoegen
|
||||
bloc_persons: Gebruikers
|
||||
bloc_persons_associated: Gebruikers van het traject
|
||||
bloc_persons_not_associated: Niet-prof. derden
|
||||
bloc_thirdparty: Professionele derden
|
||||
bloc_users: T(M)S
|
||||
location: Locatie
|
||||
choose_location: Kies een locatie
|
||||
choose_location_type: Kies een type locatie
|
||||
create_new_location: Nieuwe locatie aanmaken
|
||||
location_fields:
|
||||
name: Naam
|
||||
type: Type
|
||||
phonenumber1: Telefoon
|
||||
phonenumber2: Andere telefoon
|
||||
email: E-mailadres
|
||||
create_address: Adres aanmaken
|
||||
edit_address: Adres bewerken
|
||||
|
||||
No documents: Geen document
|
||||
|
||||
# activity filter in list page
|
||||
activity_filter:
|
||||
My activities: Mijn uitwisselingen (waar ik aan deelneem)
|
||||
Types: Op type uitwisseling
|
||||
Jobs: Op betrokken beroep
|
||||
Insert a document: Insérer un document
|
||||
Remove a document: Supprimer le document
|
||||
comment: Commentaire
|
||||
No documents: Aucun document
|
||||
|
||||
#timeline
|
||||
'%user% has done an %activity_type%': '%user% heeft een uitwisseling van type "%activity_type%" uitgevoerd'
|
||||
'%user% has done an %activity_type%': '%user% a effectué un échange de type "%activity_type%"'
|
||||
|
||||
#controller
|
||||
'Success : activity created!': De uitwisseling is aangemaakt.
|
||||
'The form is not valid. The activity has not been created !': Het formulier is ongeldig. De uitwisseling is niet aangemaakt.
|
||||
'Success : activity updated!': De uitwisseling is bijgewerkt.
|
||||
'The form is not valid. The activity has not been updated !': Het formulier is ongeldig. De uitwisseling is niet bijgewerkt.
|
||||
'Success : activity created!': L'échange a été créé.
|
||||
'The form is not valid. The activity has not been created !': Le formulaire est invalide. L'échange n'a pas été créé.
|
||||
'Success : activity updated!': L'échange a été mis à jour.
|
||||
'The form is not valid. The activity has not been updated !': Le formulaire est invalide. L'échange n'a pas été mis à jour.
|
||||
|
||||
# ROLES
|
||||
CHILL_ACTIVITY_CREATE: Uitwisseling aanmaken
|
||||
CHILL_ACTIVITY_UPDATE: Uitwisseling bewerken
|
||||
CHILL_ACTIVITY_SEE: Uitwisseling bekijken
|
||||
CHILL_ACTIVITY_SEE_DETAILS: Detail van uitwisselingen bekijken
|
||||
CHILL_ACTIVITY_DELETE: Uitwisseling verwijderen
|
||||
CHILL_ACTIVITY_STATS: Statistieken van uitwisselingen
|
||||
CHILL_ACTIVITY_LIST: Lijst van uitwisselingen
|
||||
CHILL_ACTIVITY_CREATE_PERSON: Uitwisseling aanmaken gekoppeld aan een gebruiker
|
||||
CHILL_ACTIVITY_CREATE_ACCOMPANYING_COURSE: Uitwisseling aanmaken gekoppeld aan een traject
|
||||
CHILL_ACTIVITY_FULL: Details bekijken, aanmaken, verwijderen en bijwerken van een uitwisseling
|
||||
CHILL_ACTIVITY_CREATE: Créer un échange
|
||||
CHILL_ACTIVITY_UPDATE: Modifier un échange
|
||||
CHILL_ACTIVITY_SEE: Voir un échange
|
||||
CHILL_ACTIVITY_SEE_DETAILS: Voir le détail des échanges
|
||||
CHILL_ACTIVITY_DELETE: Supprimer un échange
|
||||
CHILL_ACTIVITY_STATS: Statistique des échanges
|
||||
CHILL_ACTIVITY_LIST: Liste des échanges
|
||||
|
||||
# admin
|
||||
Activities: Uitwisselingen
|
||||
Activity configuration: Configuratie van uitwisselingen
|
||||
Activity configuration menu: Configuratie van uitwisselingen
|
||||
Activity types: Types uitwisseling
|
||||
Activity type configuration: Configuratie van categorieën van uitwisselingen
|
||||
Activity Reasons: Onderwerpen van een uitwisseling
|
||||
Activity Reasons Category: Categorieën van onderwerpen van uitwisselingen
|
||||
Activity Types Categories: Categorieën van types uitwisseling
|
||||
Activity Presences: Aanwezigheden bij uitwisselingen
|
||||
Associated activity reason category is inactive: De gekoppelde onderwerpscategorie is inactief
|
||||
Activities: Échanges
|
||||
Activity configuration: Configuration des échanges
|
||||
Activity configuration menu: Configuration des échanges
|
||||
Activity types: Types d'échange
|
||||
Activity type configuration: Configuration des categories d'échanges
|
||||
Activity Reasons: Sujets d'un échange
|
||||
Activity Reasons Category: Catégories de sujet d'échanges
|
||||
Activity Types Categories: Catégories des types d'échanges
|
||||
Activity Presences: Presences des échanges
|
||||
|
||||
|
||||
# Crud
|
||||
crud:
|
||||
activity_type:
|
||||
title_new: Nieuw type uitwisseling
|
||||
title_edit: Type uitwisseling bewerken
|
||||
title_new: Nouveau type d'échange
|
||||
title_edit: Edition d'un type d'échange
|
||||
activity_type_category:
|
||||
title_new: Nieuwe categorie van type uitwisseling
|
||||
title_edit: Categorie van type uitwisseling bewerken
|
||||
activity_presence:
|
||||
title_new: Nieuwe aanwezigheid bij uitwisselingen
|
||||
title_edit: Aanwezigheid bij uitwisselingen bewerken
|
||||
title_new: Nouvelle catégorie de type d'échange
|
||||
title_edit: Edition d'une catégorie de type d'échange
|
||||
|
||||
# activity reason admin
|
||||
ActivityReason list: Lijst van onderwerpen
|
||||
Create a new activity reason: Nieuw onderwerp aanmaken
|
||||
Active: Actief
|
||||
Category: Categorie
|
||||
ActivityReason creation: Nieuw onderwerp
|
||||
ActivityReason edit: Onderwerp bewerken
|
||||
ActivityReason: Onderwerp van uitwisseling
|
||||
The entity is inactive and won't be proposed: Het onderwerp is inactief en zal niet worden voorgesteld
|
||||
The entity is active and will be proposed: Het onderwerp is actief en zal worden voorgesteld
|
||||
ActivityReason list: Liste des sujets
|
||||
Create a new activity reason: Créer un nouveau sujet
|
||||
Active: Actif
|
||||
Category: Catégorie
|
||||
ActivityReason creation: Nouveau sujet
|
||||
ActivityReason edit: Modification d'un sujet
|
||||
ActivityReason: Sujet d'échange
|
||||
The entity is inactive and won't be proposed: Le sujet est inactif et ne sera pas proposé
|
||||
The entity is active and will be proposed: Le sujet est actif et sera proposé
|
||||
|
||||
#activity reason category admin
|
||||
ActivityReasonCategory list: Categorieën van onderwerpen
|
||||
Create a new activity category reason: Nieuwe categorie aanmaken
|
||||
ActivityReasonCategory creation: Nieuwe categorie van onderwerp
|
||||
ActivityReasonCategory edit: Categorie van onderwerp bewerken
|
||||
ActivityReasonCategory: Categorie van onderwerp van uitwisseling
|
||||
ActivityReasonCategory is active and will be proposed: De categorie is actief en zal worden voorgesteld
|
||||
ActivityReasonCategory is inactive and won't be proposed: De categorie is inactief en zal niet worden voorgesteld
|
||||
|
||||
#activity presence admin
|
||||
ActivityPresence list: Lijst van aanwezigheden bij uitwisselingen
|
||||
Create a new activity presence: Nieuwe "Aanwezigheid bij uitwisselingen" aanmaken
|
||||
ActivityReasonCategory list: Catégories de sujets
|
||||
Create a new activity category reason: Créer une nouvelle catégorie
|
||||
ActivityReasonCategory creation: Nouvelle catégorie de sujet
|
||||
ActivityReasonCategory edit: Modification d'une catégorie de sujet
|
||||
ActivityReasonCategory: Catégorie de sujet d'échange
|
||||
ActivityReasonCategory is active and will be proposed: La catégorie est active et sera proposée
|
||||
ActivityReasonCategory is inactive and won't be proposed: La catégorie est inactive et ne sera pas proposée
|
||||
|
||||
# activity type type admin
|
||||
ActivityType list: Types uitwisselingen
|
||||
Create a new activity type: Nieuw type uitwisseling aanmaken
|
||||
Persons visible: Zichtbaarheid van het veld Gebruikers
|
||||
Persons label: Label van het veld Gebruikers
|
||||
User visible: Zichtbaarheid van het veld Gebruiker
|
||||
User label: Label van het veld Gebruiker
|
||||
Date visible: Zichtbaarheid van het veld Datum
|
||||
Date label: Label van het veld Datum
|
||||
Location visible: Zichtbaarheid van het veld Plaats
|
||||
Location label: Label van het veld Plaats
|
||||
Third parties visible: Zichtbaarheid van het veld Derden
|
||||
Third parties label: Label van het veld Derden
|
||||
Duration time visible: Zichtbaarheid van het veld Duur
|
||||
Duration time label: Label van het veld Duur
|
||||
Travel time visible: Zichtbaarheid van het veld Reisduur
|
||||
Travel time label: Label van het veld Reisduur
|
||||
Attendee visible: Zichtbaarheid van het veld Aanwezigheid van de gebruiker
|
||||
Attendee label: Label van het veld Aanwezigheid van de gebruiker
|
||||
Reasons visible: Zichtbaarheid van het veld Onderwerp
|
||||
Reasons label: Label van het veld Onderwerp
|
||||
Comment visible: Zichtbaarheid van het veld Opmerking
|
||||
Comment label: Label van het veld Opmerking
|
||||
Private comment visible: Zichtbaarheid van het veld Privé Opmerking
|
||||
Private comment label: Label van het veld Privé Opmerking
|
||||
Emergency visible: Zichtbaarheid van het veld Urgent
|
||||
Emergency label: Label van het veld Urgent
|
||||
Accompanying period visible: Zichtbaarheid van het veld begeleidingstraject
|
||||
Accompanying period label: Label van het veld begeleidingstraject
|
||||
Social issues visible: Zichtbaarheid van het veld Sociale problematieken
|
||||
Social issues label: Label van het veld Sociale problematieken
|
||||
Social actions visible: Zichtbaarheid van het veld Sociale actie
|
||||
Social actions label: Label van het veld Sociale actie
|
||||
Users visible: Zichtbaarheid van het veld Gebruikers
|
||||
Users label: Label van het veld Gebruikers
|
||||
Sent received visible: Zichtbaarheid van het veld Inkomend / Uitgaand
|
||||
Sent received label: Label van het veld Inkomend / Uitgaand
|
||||
Documents visible: Zichtbaarheid van het veld Documenten
|
||||
Documents label: Label van het veld Documenten
|
||||
ActivityType list: Types d'échanges
|
||||
Create a new activity type: Créer un nouveau type d'échange
|
||||
Persons visible: Visibilité du champ Personnes
|
||||
Persons label: Libellé du champ Personnes
|
||||
User visible: Visibilité du champ Utilisateur
|
||||
User label: Libellé du champ Utilisateur
|
||||
Date visible: Visibilité du champ Date
|
||||
Date label: Libellé du champ Date
|
||||
Location visible: Visibilité du champ Lieu
|
||||
Location label: Libellé du champ Lieu
|
||||
Third parties visible: Visibilité du champ Tiers
|
||||
Third parties label: Libellé du champ Tiers
|
||||
Duration time visible: Visibilité du champ Durée
|
||||
Duration time label: Libellé du champ Durée
|
||||
Travel time visible: Visibilité du champ Durée de déplacement
|
||||
Travel time label: Libellé du champ Durée de déplacement
|
||||
Attendee visible: Visibilité du champ Présence de l'usager
|
||||
Attendee label: Libellé du champ Présence de l'usager
|
||||
Reasons visible: Visibilité du champ Sujet
|
||||
Reasons label: Libellé du champ Sujet
|
||||
Comment visible: Visibilité du champ Commentaire
|
||||
Comment label: Libellé du champ Commentaire
|
||||
Emergency visible: Visibilité du champ Urgent
|
||||
Emergency label: Libellé du champ Urgent
|
||||
Accompanying period visible: Visibilité du champ Période d'accompagnement
|
||||
Accompanying period label: Libellé du champ Période d'accompagnement
|
||||
Social issues visible: Visibilité du champ Problématiques sociales
|
||||
Social issues label: Libellé du champ Problématiques sociales
|
||||
Social actions visible: Visibilité du champ Action sociale
|
||||
Social actions label: Libellé du champ Action sociale
|
||||
Users visible: Visibilité du champ Utilisateurs
|
||||
Users label: Libellé du champ Utilisateurs
|
||||
Sent received visible: Visibilité du champ Entrant / Sortant
|
||||
Sent received label: Libellé du champ Entrant / Sortant
|
||||
Documents visible: Visibilité du champ Documents
|
||||
Documents label: Libellé du champ Documents
|
||||
|
||||
# activity type category admin
|
||||
ActivityTypeCategory list: Lijst van categorieën van types uitwisseling
|
||||
Create a new activity type category: Nieuwe categorie van type uitwisseling aanmaken
|
||||
Create a new activity in accompanying course: Uitwisseling aanmaken in het traject
|
||||
ActivityTypeCategory list: Liste des catégories des types d'activité
|
||||
Create a new activity type category: Créer une nouvelle catégorie de type d'échange
|
||||
|
||||
# activity delete
|
||||
Remove activity: Uitwisseling verwijderen
|
||||
Are you sure you want to remove the activity about "%name%" ?: Weet u zeker dat u een uitwisseling wilt verwijderen die betrekking heeft op "%name%"?
|
||||
The activity has been successfully removed.: De uitwisseling is verwijderd.
|
||||
Remove activity: Supprimer un échange
|
||||
Are you sure you want to remove the activity about "%name%" ?: Êtes-vous sûr de vouloir supprimer un échange qui concerne "%name%" ?
|
||||
The activity has been successfully removed.: L'échange a été supprimée.
|
||||
|
||||
# exports
|
||||
Exports of activities linked to a person: Exports van uitwisselingen gekoppeld aan een gebruiker
|
||||
Number of activities linked to a person: Aantal uitwisselingen gekoppeld aan een gebruiker
|
||||
Count activities linked to a person: Aantal uitwisselingen
|
||||
Count activities linked to a person by various parameters.: Telt het aantal geregistreerde uitwisselingen gekoppeld aan een gebruiker op basis van verschillende parameters.
|
||||
Sum activity linked to a person duration: Duur van uitwisselingen
|
||||
Sum activities linked to a person duration: Duur van uitwisselingen gekoppeld aan een gebruiker
|
||||
Sum activities linked to a person duration by various parameters.: Telt de duur van uitwisselingen op basis van verschillende parameters.
|
||||
List activity linked to a person: Uitwisselingen opsommen
|
||||
List activities linked to a person: Lijst van uitwisselingen gekoppeld aan een gebruiker
|
||||
List activities linked to a person description: Maakt de lijst van uitwisselingen op basis van verschillende parameters.
|
||||
|
||||
Exports of activities linked to an accompanying period: Exports van uitwisselingen gekoppeld aan een traject
|
||||
Number of activities linked to an accompanying period: Aantal uitwisselingen gekoppeld aan een traject
|
||||
Count activities linked to an accompanying period: Aantal uitwisselingen
|
||||
Count activities linked to an accompanying period by various parameters.: Telt het aantal geregistreerde uitwisselingen gekoppeld aan een traject op basis van verschillende parameters.
|
||||
Sum activity linked to an accompanying period duration: Som van de duur van uitwisselingen
|
||||
Sum activities linked to an accompanying period duration: Som van de duur van uitwisselingen gekoppeld aan een traject
|
||||
Sum activities linked to an accompanying period duration by various parameters.: Telt de duur van uitwisselingen op basis van verschillende parameters.
|
||||
Sum activity linked to an accompanying period visit duration: Som van de reisduur van uitwisselingen
|
||||
Sum activities linked to an accompanying period visit duration: Som van de reisduur van uitwisselingen gekoppeld aan een traject
|
||||
Sum activities linked to an accompanying period visit duration by various parameters.: Telt de reisduur van uitwisselingen op basis van verschillende parameters.
|
||||
Average activity linked to an accompanying period duration: Gemiddelde van de duur van uitwisselingen
|
||||
Average activities linked to an accompanying period duration: Gemiddelde van de duur van uitwisselingen gekoppeld aan een traject
|
||||
Average activities linked to an accompanying period duration by various parameters.: Gemiddelde van de duur van uitwisselingen op basis van verschillende parameters.
|
||||
Average activity linked to an accompanying period visit duration: Gemiddelde van de reisduur van uitwisselingen
|
||||
Average activities linked to an accompanying period visit duration: Gemiddelde van de reisduur van uitwisselingen gekoppeld aan een traject
|
||||
Average activities linked to an accompanying period visit duration by various parameters.: Gemiddelde van de reisduur van uitwisselingen op basis van verschillende parameters.
|
||||
Count activities: Nombre d'échanges
|
||||
Count activities by various parameters.: Compte le nombre d'échanges enregistrées en fonction de différents paramètres.
|
||||
Sum activity duration: Total de la durée des échanges
|
||||
Sum activities duration by various parameters.: Additionne la durée des échanges en fonction de différents paramètres.
|
||||
List activities: Liste les échanges
|
||||
Number of activities: Nombre d'échanges
|
||||
|
||||
#filters
|
||||
Filter by reason: Uitwisselingen filteren op onderwerp
|
||||
'Filtered by reasons: only %list%': 'Gefilterd op onderwerp: alleen %list%'
|
||||
'Filtered by activity type: only %list%': "Gefilterd op type uitwisseling: alleen %list%"
|
||||
Filtered by date activity: Uitwisselingen filteren op datum
|
||||
Activities after this date: Uitwisselingen na deze datum
|
||||
Activities before this date: Uitwisselingen vóór deze datum
|
||||
"Filtered by date of activity: only between %date_from% and %date_to%": "Gefilterd op datum van de uitwisseling: alleen tussen %date_from% en %date_to%"
|
||||
This date should be after the date given in "Implied in an activity after this date" field: Deze datum moet later zijn dan de datum in het veld "uitwisselingen na deze datum"
|
||||
Filter by reason: Filtrer par sujet d'activité
|
||||
'Filtered by reasons: only %list%': 'Filtré par sujet: seulement %list%'
|
||||
'Filtered by activity type: only %list%': "Filtré par type d'activity: uniquement %list%"
|
||||
Filtered by date activity: Filtrer par date d'activité
|
||||
Activities after this date: Activités après cette date
|
||||
Activities before this date: Activités avant cette date
|
||||
"Filtered by date of activity: only between %date_from% and %date_to%": "Filtré par date de l'activité: uniquement entre %date_from% et %date_to%"
|
||||
This date should be after the date given in "Implied in an activity after this date" field: Cette date devrait être postérieure à la date donnée dans le champ "activités après cette date"
|
||||
|
||||
Filtered by person having an activity in a period: Uniquement les personnes ayant eu une activité dans la période donnée
|
||||
Implied in an activity after this date: Impliqué dans une activité après cette date
|
||||
Implied in an activity before this date: Impliqué dans une activité avant cette date
|
||||
Filtered by person having an activity between %date_from% and %date_to% with reasons %reasons_name%: Filtré par personnes associées à une activité entre %date_from% et %date_to% avec les sujets %reasons_name%
|
||||
Activity reasons for those activities: Sujets de ces activités
|
||||
|
||||
Filter by activity type: Uitwisselingen filteren op type
|
||||
|
||||
Filter activity by location: Uitwisselingen filteren op locatie
|
||||
'Filtered activity by location: only %locations%': "Gefilterd op locatie: alleen %locations%"
|
||||
Filter activity by locationtype: Uitwisselingen filteren op type locatie
|
||||
'Filtered activity by locationtype: only %types%': "Gefilterd op type locatie: alleen %types%"
|
||||
Accepted locationtype: Types locatie
|
||||
Accepted users: TMS(en)
|
||||
Filter activity by emergency: Uitwisselingen filteren op urgentie
|
||||
'Filtered activity by emergency: only %emergency%': "Gefilterd op urgentie: alleen als %emergency%"
|
||||
activity is emergency: de uitwisseling is urgent
|
||||
activity is not emergency: de uitwisseling is niet urgent
|
||||
Filter activity by sentreceived: Uitwisselingen filteren op verzonden/ontvangen
|
||||
'Filtered activity by sentreceived: only %sentreceived%': "Gefilterd op verzonden/ontvangen: alleen %sentreceived%"
|
||||
Accepted sentreceived: ''
|
||||
Filter activity by linked socialaction: Uitwisselingen filteren op gekoppelde actie
|
||||
'Filtered activity by linked socialaction: only %actions%': "Gefilterd op gekoppelde actie: alleen %actions%"
|
||||
Filter activity by linked socialissue: Uitwisselingen filteren op gekoppelde problematiek
|
||||
'Filtered activity by linked socialissue: only %issues%': "Gefilterd op gekoppelde problematiek: alleen %issues%"
|
||||
Filter activity by user: Uitwisselingen filteren op hoofdgebruiker
|
||||
Filter activity by users: Uitwisselingen filteren op deelnemende gebruiker
|
||||
Filter activity by creator: Uitwisselingen filteren op aanmaker van de uitwisseling
|
||||
'Filtered activity by user: only %users%': "Gefilterd op referent: alleen %users%"
|
||||
'Filtered activity by users: only %users%': "Gefilterd op deelnemende gebruikers: alleen %users%"
|
||||
'Filtered activity by creator: only %users%': "Gefilterd op aanmaker: alleen %users%"
|
||||
Creators: Aanmakers
|
||||
Accepted userscope: Diensten
|
||||
|
||||
Filter acp which has no activity: Trajecten filteren die geen uitwisseling hebben
|
||||
Filtered acp which has no activities: Trajecten zonder gekoppelde uitwisseling filteren
|
||||
Group acp by activity number: Trajecten groeperen op aantal uitwisselingen
|
||||
Filter by activity type: Filtrer par type d'activité
|
||||
|
||||
#aggregators
|
||||
Activity type: Type uitwisseling
|
||||
Activity user: Gebruiker gekoppeld aan de uitwisseling
|
||||
By reason: Op onderwerp
|
||||
By category of reason: Op categorie van onderwerp
|
||||
Reason's level: Niveau van het onderwerp
|
||||
Group by reasons: Onderwerp van uitwisseling
|
||||
Aggregate by activity user: Uitwisselingen groeperen op referent
|
||||
Aggregate by activity users: Uitwisselingen groeperen op deelnemende gebruikers
|
||||
Aggregate by activity type: Uitwisselingen groeperen op type
|
||||
Aggregate by activity reason: Uitwisselingen groeperen op onderwerp
|
||||
Activity type: Type d'activité
|
||||
Activity user: Utilisateur lié à l'activity
|
||||
By reason: Par sujet
|
||||
By category of reason: Par catégorie de sujet
|
||||
Reason's level: Niveau du sujet
|
||||
Group by reasons: Sujet d'activité
|
||||
Aggregate by activity user: Grouper par utilisateur lié à l'activité
|
||||
Aggregate by activity type: Grouper par type d'activité
|
||||
Aggregate by activity reason: Grouper par sujet de l'activité
|
||||
|
||||
Group activity by locationtype: Uitwisselingen groeperen op type locatie
|
||||
Group activity by date: Uitwisselingen groeperen op datum
|
||||
Frequency: Frequentie
|
||||
by month: Per maand
|
||||
by week: Per week
|
||||
for week: Week
|
||||
by year: Per jaar
|
||||
in year: In
|
||||
Group activity by creator: Uitwisselingen groeperen op aanmaker van de uitwisseling
|
||||
Group activity by linked thirdparties: Uitwisselingen groeperen op betrokken derde
|
||||
Accepted thirdparty: Betrokken derde
|
||||
Group activity by linked socialaction: Uitwisselingen groeperen op gekoppelde actie
|
||||
Group activity by linked socialissue: Uitwisselingen groeperen op gekoppelde problematiek
|
||||
Group activity by userscope: Uitwisselingen groeperen op dienst van de aanmaker
|
||||
Last activities: Les dernières activités
|
||||
|
||||
Last activities: De laatste uitwisselingen
|
||||
See activity in accompanying course context: Voir l'activité dans le contexte du parcours d'accompagnement
|
||||
|
||||
See activity in accompanying course context: Uitwisseling bekijken in de context van het begeleidingstraject
|
||||
|
||||
You get notified of an activity which does not exists any more: Deze melding komt niet overeen met een geldige uitwisseling.
|
||||
you are not allowed to see it details: De melding verwijst naar een uitwisseling waartoe u geen toegang hebt.
|
||||
This is the minimal activity data: Uitwisseling nr.
|
||||
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: Uitwisseling
|
||||
A basic context for activity: Context voor uitwisselingen
|
||||
Accompanying period with a list of activities: Begeleidingstraject met lijst van uitwisselingen
|
||||
Accompanying period with a list of activities description: Deze context neemt de informatie van het traject over, en alle uitwisselingen voor een traject. De uitwisselingen worden niet gefilterd.
|
||||
myActivitiesOnly: Alleen rekening houden met uitwisselingen waarin ik heb deelgenomen
|
||||
myWorksOnly: Alleen rekening houden met begeleidingsacties waarvan ik referent ben
|
||||
|
||||
export:
|
||||
export:
|
||||
count_person_on_activity:
|
||||
title: Aantal betrokken gebruikers bij uitwisselingen
|
||||
description: Telt het aantal betrokken gebruikers bij uitwisselingen. Als een gebruiker aanwezig is in meerdere uitwisselingen, wordt hij slechts één keer geteld.
|
||||
header: Aantal betrokken gebruikers bij uitwisselingen
|
||||
count_household_on_activity:
|
||||
title: Aantal betrokken huishoudens bij uitwisselingen
|
||||
description: Telt het aantal betrokken huishoudens bij uitwisselingen. Als een huishouden aanwezig is in meerdere uitwisselingen, wordt het slechts één keer geteld. Gebruikers zonder huishouden worden niet geteld.
|
||||
header: Aantal betrokken huishoudens bij uitwisselingen
|
||||
count_household_on_activity_person:
|
||||
title: Aantal betrokken huishoudens bij uitwisselingen
|
||||
description: Telt het aantal betrokken huishoudens bij uitwisselingen. Als een huishouden aanwezig is in meerdere uitwisselingen, wordt het slechts één keer geteld. Gebruikers zonder huishouden worden niet geteld. Wanneer een gebruiker van huishouden verandert, wordt elk huishouden één keer geteld.
|
||||
header: Aantal betrokken huishoudens bij uitwisselingen
|
||||
list:
|
||||
activity:
|
||||
users name: Naam van de gebruikers
|
||||
users ids: Identificatie van de gebruikers
|
||||
third parties ids: Identificatie van de derden
|
||||
persons ids: Identificatie van de gebruikers
|
||||
persons name: Naam van de gebruikers
|
||||
thirds parties: Derden
|
||||
date: Datum van de uitwisseling
|
||||
locationName: Locatie
|
||||
sent received: Verzonden of ontvangen
|
||||
emergency: Urgentie
|
||||
accompanying course id: Identificatie van het traject
|
||||
course circles: Diensten van het traject
|
||||
travelTime: Reisduur
|
||||
durationTime: Duur
|
||||
id: Identificatie
|
||||
List activities linked to an accompanying course: Somt uitwisselingen op gekoppeld aan een traject op basis van verschillende filters.
|
||||
List activity linked to a course: Lijst van uitwisselingen gekoppeld aan een traject
|
||||
commentText: Opmerking
|
||||
comment_date: Datum van de laatste bewerking van de opmerking
|
||||
comment_user: Laatste bewerking door
|
||||
|
||||
filter:
|
||||
activity:
|
||||
by_users_job:
|
||||
Filter by users job: Uitwisselingen filteren op beroep van ten minste één deelnemende gebruiker
|
||||
'Filtered activity by users job: only %jobs%': 'Gefilterd op beroep van ten minste één deelnemende gebruiker: alleen %jobs%'
|
||||
by_users_scope:
|
||||
Filter by users scope: Uitwisselingen filteren op dienst van ten minste één deelnemende gebruiker
|
||||
'Filtered activity by users scope: only %scopes%': 'Gefilterd op dienst van ten minste één deelnemende gebruiker: alleen %scopes%'
|
||||
course_having_activity_between_date:
|
||||
Title: Trajecten filteren die een uitwisseling hebben ontvangen tussen twee data
|
||||
Receiving an activity after: Die een uitwisseling hebben ontvangen na
|
||||
Receiving an activity before: Die een uitwisseling hebben ontvangen vóór
|
||||
acp_by_activity_type:
|
||||
'activity after': Uitwisselingen na
|
||||
activity after help: Indien leeg gelaten, wordt er geen rekening mee gehouden
|
||||
activity before: Uitwisselingen vóór
|
||||
activity before help: Indien leeg gelaten, wordt er geen rekening mee gehouden
|
||||
person_between_dates:
|
||||
Implied in an activity after this date: Betrokken bij een uitwisseling na deze datum
|
||||
Implied in an activity before this date: Betrokken bij een uitwisseling vóór deze datum
|
||||
Activity reasons for those activities: Onderwerpen van deze uitwisselingen
|
||||
if no reasons: Als geen enkel onderwerp is aangevinkt, worden alle onderwerpen in aanmerking genomen
|
||||
title: Gebruikers filteren die gekoppeld zijn geweest aan een uitwisseling tijdens de periode
|
||||
date mismatch: De einddatum van de periode moet later zijn dan de startdatum
|
||||
by_creator_scope:
|
||||
Filter activity by user scope: Uitwisselingen filteren op dienst van de aanmaker van de uitwisseling
|
||||
'Filtered activity by user scope: only %scopes%': "Gefilterd op dienst van de aanmaker van de uitwisseling: alleen %scopes%"
|
||||
by_creator_job:
|
||||
job_form_label: Beroepen
|
||||
Filter activity by user job: Uitwisselingen filteren op beroep van de aanmaker van de uitwisseling
|
||||
'Filtered activity by user job: only %jobs%': "Gefilterd op beroep van de aanmaker van de uitwisseling: alleen %jobs%"
|
||||
by_persons:
|
||||
Filter activity by persons: Uitwisselingen filteren op deelnemende gebruiker
|
||||
'Filtered activity by persons: only %persons%': 'Uitwisselingen gefilterd op deelnemende gebruikers: alleen %persons%'
|
||||
persons taking part on the activity: Gebruikers deelnemend aan de uitwisseling
|
||||
by_sent_received:
|
||||
Sent or received: Verzonden of ontvangen
|
||||
is sent: verzonden
|
||||
is received: ontvangen
|
||||
by_presence:
|
||||
Filter activity by activity presence: Uitwisselingen filteren op aanwezigheid van de gebruiker
|
||||
presences: Aanwezigheden
|
||||
'Filtered by activity presence: only %presences%': 'Gefilterd op aanwezigheid van de gebruiker: alleen %presences%'
|
||||
|
||||
aggregator:
|
||||
person:
|
||||
by_person:
|
||||
title: Uitwisselingen groeperen op gebruiker (gebruikersdossier waarin de uitwisseling is geregistreerd)
|
||||
person: Gebruiker
|
||||
by_household:
|
||||
title: Uitwisselingen groeperen op huishouden
|
||||
household: Identificatie huishouden
|
||||
acp:
|
||||
by_activity_type:
|
||||
title: Trajecten groeperen op type uitwisseling
|
||||
after_date: Alleen uitwisselingen na deze datum
|
||||
before_date: Alleen uitwisselingen vóór deze datum
|
||||
activity_type: Types uitwisseling
|
||||
activity:
|
||||
by_sent_received:
|
||||
Sent or received: Verzonden of ontvangen
|
||||
is sent: verzonden
|
||||
is received: ontvangen
|
||||
Group activity by sentreceived: Uitwisselingen groeperen op verzonden / ontvangen
|
||||
by_location:
|
||||
Activity Location: Locatie van de uitwisseling
|
||||
Title: Uitwisselingen groeperen op locatie van de uitwisseling
|
||||
by_user_job:
|
||||
Users 's job: Beroep van de gebruikers deelnemend aan de uitwisseling
|
||||
Aggregate by users job: Uitwisselingen groeperen op beroep van de deelnemende gebruikers
|
||||
by_user_scope:
|
||||
Users 's scope: Hoofddienst van de gebruikers deelnemend aan de uitwisseling
|
||||
Aggregate by users scope: Uitwisselingen groeperen op hoofddienst van de gebruiker
|
||||
by_creator_scope:
|
||||
Group activity by creator scope: Uitwisselingen groeperen op dienst van de aanmaker van de uitwisseling
|
||||
Calc date: Berekeningsdatum van de dienst van de aanmaker van de uitwisseling
|
||||
by_creator_job:
|
||||
Group activity by creator job: Uitwisselingen groeperen op beroep van de aanmaker van de uitwisseling
|
||||
Calc date: Berekeningsdatum van het beroep van de aanmaker van de uitwisseling
|
||||
by_persons:
|
||||
Group activity by persons: Uitwisselingen groeperen op deelnemende gebruiker
|
||||
Persons: Deelnemende gebruikers
|
||||
by_activity_presence:
|
||||
Group activity by presence: Uitwisselingen groeperen op aanwezigheid van de gebruiker
|
||||
header: Aanwezigheid van gebruiker(s)
|
||||
|
||||
generic_doc:
|
||||
filter:
|
||||
keys:
|
||||
accompanying_period_activity_document: Document van uitwisselingen van trajecten
|
||||
Activity basic: Echange
|
||||
A basic context for activity: Contexte pour les activités
|
||||
|
||||
@@ -25,7 +25,6 @@ final class ChillAsideActivityExtension extends Extension implements PrependExte
|
||||
$config = $this->processConfiguration($configuration, $configs);
|
||||
|
||||
$container->setParameter('chill_aside_activity.form.time_duration', $config['form']['time_duration']);
|
||||
$container->setParameter('chill_aside_activity.show_concerned_persons_count', 'visible' === $config['show_concerned_persons_count']);
|
||||
|
||||
$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../config'));
|
||||
$loader->load('services.yaml');
|
||||
@@ -39,24 +38,6 @@ final class ChillAsideActivityExtension extends Extension implements PrependExte
|
||||
{
|
||||
$this->prependRoute($container);
|
||||
$this->prependCruds($container);
|
||||
$this->prependTwigConfig($container);
|
||||
}
|
||||
|
||||
protected function prependTwigConfig(ContainerBuilder $container)
|
||||
{
|
||||
// Get the configuration for this bundle
|
||||
$chillAsideActivityConfig = $container->getExtensionConfig($this->getAlias());
|
||||
$config = $this->processConfiguration($this->getConfiguration($chillAsideActivityConfig, $container), $chillAsideActivityConfig);
|
||||
|
||||
// Add configuration to twig globals
|
||||
$twigConfig = [
|
||||
'globals' => [
|
||||
'chill_aside_activity_config' => [
|
||||
'show_concerned_persons_count' => 'visible' === $config['show_concerned_persons_count'],
|
||||
],
|
||||
],
|
||||
];
|
||||
$container->prependExtensionConfig('twig', $twigConfig);
|
||||
}
|
||||
|
||||
protected function prependCruds(ContainerBuilder $container)
|
||||
|
||||
@@ -141,12 +141,6 @@ class Configuration implements ConfigurationInterface
|
||||
->end()
|
||||
->end()
|
||||
->end()
|
||||
->end()
|
||||
->enumNode('show_concerned_persons_count')
|
||||
->values(['hidden', 'visible'])
|
||||
->defaultValue('hidden')
|
||||
->info('Show the concerned persons count field in aside activity forms and views')
|
||||
->end()
|
||||
->end();
|
||||
|
||||
return $treeBuilder;
|
||||
|
||||
@@ -62,10 +62,6 @@ class AsideActivity implements TrackCreationInterface, TrackUpdateInterface
|
||||
#[ORM\ManyToOne(targetEntity: User::class)]
|
||||
private User $updatedBy;
|
||||
|
||||
#[Assert\GreaterThanOrEqual(0)]
|
||||
#[ORM\Column(type: \Doctrine\DBAL\Types\Types::INTEGER, nullable: true)]
|
||||
private ?int $concernedPersonsCount = 0;
|
||||
|
||||
public function getAgent(): ?User
|
||||
{
|
||||
return $this->agent;
|
||||
@@ -190,16 +186,4 @@ class AsideActivity implements TrackCreationInterface, TrackUpdateInterface
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getConcernedPersonsCount(): ?int
|
||||
{
|
||||
return $this->concernedPersonsCount;
|
||||
}
|
||||
|
||||
public function setConcernedPersonsCount(?int $concernedPersonsCount): self
|
||||
{
|
||||
$this->concernedPersonsCount = $concernedPersonsCount;
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,86 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
namespace Chill\AsideActivityBundle\Export\Aggregator;
|
||||
|
||||
use Chill\AsideActivityBundle\Export\Declarations;
|
||||
use Chill\MainBundle\Export\AggregatorInterface;
|
||||
use Doctrine\ORM\QueryBuilder;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
|
||||
class ByConcernedPersonsCountAggregator implements AggregatorInterface
|
||||
{
|
||||
public function addRole(): ?string
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void
|
||||
{
|
||||
$qb->addSelect('aside.concernedPersonsCount AS by_concerned_persons_count_aggregator')
|
||||
->addGroupBy('by_concerned_persons_count_aggregator');
|
||||
}
|
||||
|
||||
public function applyOn(): string
|
||||
{
|
||||
return Declarations::ASIDE_ACTIVITY_TYPE;
|
||||
}
|
||||
|
||||
public function buildForm(FormBuilderInterface $builder): void
|
||||
{
|
||||
// No form needed
|
||||
}
|
||||
|
||||
public function getNormalizationVersion(): int
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
public function normalizeFormData(array $formData): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
public function denormalizeFormData(array $formData, int $fromVersion): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
public function getFormDefaultData(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
public function getLabels($key, array $values, $data): callable
|
||||
{
|
||||
return function ($value): string {
|
||||
if ('_header' === $value) {
|
||||
return 'export.aggregator.Concerned persons count';
|
||||
}
|
||||
|
||||
if (null === $value) {
|
||||
return 'export.aggregator.No concerned persons count specified';
|
||||
}
|
||||
|
||||
return (string) $value;
|
||||
};
|
||||
}
|
||||
|
||||
public function getQueryKeys($data): array
|
||||
{
|
||||
return ['by_concerned_persons_count_aggregator'];
|
||||
}
|
||||
|
||||
public function getTitle(): string
|
||||
{
|
||||
return 'export.aggregator.Group by concerned persons count';
|
||||
}
|
||||
}
|
||||
@@ -1,116 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
namespace Chill\AsideActivityBundle\Export\Export;
|
||||
|
||||
use Chill\AsideActivityBundle\Export\Declarations;
|
||||
use Chill\AsideActivityBundle\Repository\AsideActivityRepository;
|
||||
use Chill\AsideActivityBundle\Security\AsideActivityVoter;
|
||||
use Chill\MainBundle\Export\ExportInterface;
|
||||
use Chill\MainBundle\Export\FormatterInterface;
|
||||
use Chill\MainBundle\Export\GroupedExportInterface;
|
||||
use Doctrine\ORM\Query;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
|
||||
class SumConcernedPersonsCountAsideActivity implements ExportInterface, GroupedExportInterface
|
||||
{
|
||||
public function __construct(private readonly AsideActivityRepository $repository) {}
|
||||
|
||||
public function buildForm(FormBuilderInterface $builder) {}
|
||||
|
||||
public function getNormalizationVersion(): int
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
public function normalizeFormData(array $formData): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
public function denormalizeFormData(array $formData, int $fromVersion): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
public function getFormDefaultData(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
public function getAllowedFormattersTypes(): array
|
||||
{
|
||||
return [FormatterInterface::TYPE_TABULAR];
|
||||
}
|
||||
|
||||
public function getDescription(): string
|
||||
{
|
||||
return 'export.Sum concerned persons count for aside activities';
|
||||
}
|
||||
|
||||
public function getGroup(): string
|
||||
{
|
||||
return 'export.Exports of aside activities';
|
||||
}
|
||||
|
||||
public function getLabels($key, array $values, $data)
|
||||
{
|
||||
if ('export_sum_concerned_persons_count' !== $key) {
|
||||
throw new \LogicException("the key {$key} is not used by this export");
|
||||
}
|
||||
|
||||
$labels = array_combine($values, $values);
|
||||
$labels['_header'] = $this->getTitle();
|
||||
|
||||
return static fn ($value) => $labels[$value];
|
||||
}
|
||||
|
||||
public function getQueryKeys($data): array
|
||||
{
|
||||
return ['export_sum_concerned_persons_count'];
|
||||
}
|
||||
|
||||
public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array
|
||||
{
|
||||
return $query->getQuery()->getResult(Query::HYDRATE_SCALAR);
|
||||
}
|
||||
|
||||
public function getTitle(): string
|
||||
{
|
||||
return 'export.Sum concerned persons count for aside activities';
|
||||
}
|
||||
|
||||
public function getType(): string
|
||||
{
|
||||
return Declarations::ASIDE_ACTIVITY_TYPE;
|
||||
}
|
||||
|
||||
public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder
|
||||
{
|
||||
$qb = $this->repository->createQueryBuilder('aside');
|
||||
|
||||
$qb->select('SUM(COALESCE(aside.concernedPersonsCount, 0)) as export_sum_concerned_persons_count');
|
||||
|
||||
return $qb;
|
||||
}
|
||||
|
||||
public function requiredRole(): string
|
||||
{
|
||||
return AsideActivityVoter::STATS;
|
||||
}
|
||||
|
||||
public function supportsModifiers(): array
|
||||
{
|
||||
return [
|
||||
Declarations::ASIDE_ACTIVITY_TYPE,
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -21,7 +21,6 @@ use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToTimestampTransformer;
|
||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\Form\FormEvent;
|
||||
use Symfony\Component\Form\FormEvents;
|
||||
@@ -30,13 +29,11 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
final class AsideActivityFormType extends AbstractType
|
||||
{
|
||||
private readonly array $timeChoices;
|
||||
private readonly bool $showConcernedPersonsCount;
|
||||
|
||||
public function __construct(
|
||||
ParameterBagInterface $parameterBag,
|
||||
) {
|
||||
$this->timeChoices = $parameterBag->get('chill_aside_activity.form.time_duration');
|
||||
$this->showConcernedPersonsCount = $parameterBag->get('chill_aside_activity.show_concerned_persons_count');
|
||||
}
|
||||
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
@@ -79,16 +76,6 @@ final class AsideActivityFormType extends AbstractType
|
||||
->add('location', PickUserLocationType::class)
|
||||
;
|
||||
|
||||
if ($this->showConcernedPersonsCount) {
|
||||
$builder->add('concernedPersonsCount', IntegerType::class, [
|
||||
'label' => 'Concerned persons count',
|
||||
'required' => false,
|
||||
'attr' => [
|
||||
'min' => 0,
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
foreach (['duration'] as $fieldName) {
|
||||
$builder->get($fieldName)
|
||||
->addModelTransformer($durationTimeTransformer);
|
||||
|
||||
@@ -42,11 +42,6 @@
|
||||
{%- if entity.location.name is defined -%}
|
||||
<div><i class="fa fa-fw fa-map-marker"></i>{{ entity.location.name }}</div>
|
||||
{%- endif -%}
|
||||
|
||||
{%- if entity.concernedPersonsCount > 0 -%}
|
||||
<div><i class="fa fa-fw fa-user"></i>{{ entity.concernedPersonsCount }}</div>
|
||||
{%- endif -%}
|
||||
|
||||
</div>
|
||||
<div class="item-col" style="justify-content: flex-end;">
|
||||
<div class="box">
|
||||
|
||||
@@ -38,11 +38,6 @@
|
||||
<dt class="inline">{{ 'Duration'|trans }}</dt>
|
||||
<dd>{{ entity.duration|date('H:i') }}</dd>
|
||||
|
||||
{% if chill_aside_activity_config.show_concerned_persons_count == 'visible' %}
|
||||
<dt class="inline">{{ 'Concerned persons count'|trans }}</dt>
|
||||
<dd>{{ entity.concernedPersonsCount }}</dd>
|
||||
{% endif %}
|
||||
|
||||
<dt class="inline">{{ 'Remark'|trans }}</dt>
|
||||
{%- if entity.note is empty -%}
|
||||
<dd>
|
||||
@@ -60,6 +55,5 @@
|
||||
</dl>
|
||||
|
||||
{% endblock %}
|
||||
{% block content_view_actions_duplicate_link %}{% endblock %}
|
||||
{% endembed %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -30,18 +30,6 @@ final class AsideActivityControllerTest extends WebTestCase
|
||||
self::ensureKernelShutdown();
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider generateAsideActivityId
|
||||
*/
|
||||
public function testEditWithoutUsers(int $asideActivityId)
|
||||
{
|
||||
self::ensureKernelShutdown();
|
||||
$client = $this->getClientAuthenticated();
|
||||
$client->request('GET', "/fr/asideactivity/{$asideActivityId}/edit");
|
||||
|
||||
$this->assertEquals(200, $client->getResponse()->getStatusCode());
|
||||
}
|
||||
|
||||
public static function generateAsideActivityId(): iterable
|
||||
{
|
||||
self::bootKernel();
|
||||
@@ -70,6 +58,18 @@ final class AsideActivityControllerTest extends WebTestCase
|
||||
self::ensureKernelShutdown();
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider generateAsideActivityId
|
||||
*/
|
||||
public function testEditWithoutUsers(int $asideActivityId)
|
||||
{
|
||||
self::ensureKernelShutdown();
|
||||
$client = $this->getClientAuthenticated();
|
||||
$client->request('GET', "/fr/asideactivity/{$asideActivityId}/edit");
|
||||
|
||||
$this->assertEquals(200, $client->getResponse()->getStatusCode());
|
||||
}
|
||||
|
||||
public function testIndexWithoutUsers()
|
||||
{
|
||||
self::ensureKernelShutdown();
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
namespace Chill\AsideActivityBundle\Tests\Export\Aggregator;
|
||||
|
||||
use Chill\AsideActivityBundle\Entity\AsideActivity;
|
||||
use Chill\AsideActivityBundle\Export\Aggregator\ByConcernedPersonsCountAggregator;
|
||||
use Chill\MainBundle\Test\Export\AbstractAggregatorTest;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* @coversNothing
|
||||
*/
|
||||
class ByConcernedPersonsCountAggregatorTest extends AbstractAggregatorTest
|
||||
{
|
||||
public function getAggregator()
|
||||
{
|
||||
return new ByConcernedPersonsCountAggregator();
|
||||
}
|
||||
|
||||
public static function getFormData(): array
|
||||
{
|
||||
return [
|
||||
[],
|
||||
];
|
||||
}
|
||||
|
||||
public static function getQueryBuilders(): iterable
|
||||
{
|
||||
self::bootKernel();
|
||||
$em = self::getContainer()->get(EntityManagerInterface::class);
|
||||
|
||||
return [
|
||||
$em->createQueryBuilder()
|
||||
->select('count(aside.id)')
|
||||
->from(AsideActivity::class, 'aside'),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
namespace Chill\AsideActivityBundle\Tests\Export\Export;
|
||||
|
||||
use Chill\AsideActivityBundle\Export\Export\SumConcernedPersonsCountAsideActivity;
|
||||
use Chill\AsideActivityBundle\Repository\AsideActivityRepository;
|
||||
use Chill\MainBundle\Test\Export\AbstractExportTest;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* @coversNothing
|
||||
*/
|
||||
final class SumConcernedPersonsCountAsideActivityTest extends AbstractExportTest
|
||||
{
|
||||
protected function setUp(): void
|
||||
{
|
||||
self::bootKernel();
|
||||
}
|
||||
|
||||
public function getExport()
|
||||
{
|
||||
$repository = self::getContainer()->get(AsideActivityRepository::class);
|
||||
|
||||
yield new SumConcernedPersonsCountAsideActivity($repository);
|
||||
}
|
||||
|
||||
public static function getFormData(): array
|
||||
{
|
||||
return [
|
||||
[],
|
||||
];
|
||||
}
|
||||
|
||||
public static function getModifiersCombination(): array
|
||||
{
|
||||
return [
|
||||
['aside_activity'],
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -20,10 +20,6 @@ services:
|
||||
tags:
|
||||
- { name: chill.export, alias: 'avg_aside_activity_duration' }
|
||||
|
||||
Chill\AsideActivityBundle\Export\Export\SumConcernedPersonsCountAsideActivity:
|
||||
tags:
|
||||
- { name: chill.export, alias: 'sum_aside_activity_concerned_persons_count' }
|
||||
|
||||
## Filters
|
||||
chill.aside_activity.export.date_filter:
|
||||
class: Chill\AsideActivityBundle\Export\Filter\ByDateFilter
|
||||
@@ -74,7 +70,3 @@ services:
|
||||
Chill\AsideActivityBundle\Export\Aggregator\ByLocationAggregator:
|
||||
tags:
|
||||
- { name: chill.export_aggregator, alias: 'aside_activity_location_aggregator' }
|
||||
|
||||
Chill\AsideActivityBundle\Export\Aggregator\ByConcernedPersonsCountAggregator:
|
||||
tags:
|
||||
- { name: chill.export_aggregator, alias: 'aside_activity_concerned_persons_count_aggregator' }
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
namespace Chill\Migrations\AsideActivity;
|
||||
|
||||
use Doctrine\DBAL\Schema\Schema;
|
||||
use Doctrine\Migrations\AbstractMigration;
|
||||
|
||||
final class Version20251006113048 extends AbstractMigration
|
||||
{
|
||||
public function getDescription(): string
|
||||
{
|
||||
return 'Add concernedPersonsCount property to AsideActivity entity';
|
||||
}
|
||||
|
||||
public function up(Schema $schema): void
|
||||
{
|
||||
$this->addSql('ALTER TABLE chill_asideactivity.asideactivity ADD concernedPersonsCount INT DEFAULT 0');
|
||||
}
|
||||
|
||||
public function down(Schema $schema): void
|
||||
{
|
||||
$this->addSql('ALTER TABLE chill_asideactivity.AsideActivity DROP concernedPersonsCount');
|
||||
}
|
||||
}
|
||||
@@ -27,7 +27,6 @@ Emergency: Urgent
|
||||
by: "Par "
|
||||
location: Lieu
|
||||
Asideactivity location: Localisation de l'activité
|
||||
Concerned persons count: Nombre d'usager concernés
|
||||
|
||||
# Crud
|
||||
crud:
|
||||
@@ -178,7 +177,7 @@ export:
|
||||
agent_id: Utilisateur
|
||||
creator_id: Créateur
|
||||
main_scope: Service principal de l'utilisateur
|
||||
main_center: Territoire principal de l'utilisateur
|
||||
main_center: Centre principal de l'utilisateur
|
||||
aside_activity_type: Catégorie d'activité annexe
|
||||
date: Date
|
||||
duration: Durée
|
||||
@@ -191,7 +190,6 @@ export:
|
||||
Count aside activities by various parameters.: Compte le nombre d'activités annexes selon divers critères
|
||||
Average aside activities duration: Durée moyenne des activités annexes
|
||||
Sum aside activities duration: Durée des activités annexes
|
||||
Sum concerned persons count for aside activities: Nombre d'usager concernés par les activités annexes
|
||||
filter:
|
||||
Filter by aside activity date: Filtrer les activités annexes par date
|
||||
Filter by aside activity type: Filtrer les activités annexes par type d'activité
|
||||
@@ -212,8 +210,6 @@ export:
|
||||
'Filtered by aside activity location: only %location%': "Filtré par localisation: uniquement %location%"
|
||||
aggregator:
|
||||
Group by aside activity type: Grouper les activités annexes par type d'activité
|
||||
Group by concerned persons count: Grouper les activités annexes par nombre d'usagers conernés
|
||||
Concerned persons count: Nombre d'usagers concernés
|
||||
Aside activity type: Type d'activité annexe
|
||||
by_user_job:
|
||||
Aggregate by user job: Grouper les activités annexes par métier des utilisateurs
|
||||
|
||||
@@ -165,60 +165,3 @@ Phonecall: "Telefoon oproep"
|
||||
Aside activities: Nevenactiviteiten
|
||||
Aside activity types: Types nevenactiviteiten
|
||||
Aside activity type configuration: Configuratie categorieën nevenactiviteiten
|
||||
|
||||
# exports
|
||||
export:
|
||||
aside_activity:
|
||||
List of aside activities: Lijst van nevenactiviteiten
|
||||
createdAt: Aanmaak
|
||||
updatedAt: Laatste update
|
||||
agent_id: Gebruiker
|
||||
creator_id: Aanmaker
|
||||
main_scope: Hoofddienst van de gebruiker
|
||||
main_center: Hoofdterritorium van de gebruiker
|
||||
aside_activity_type: Categorie nevenactiviteit
|
||||
date: Datum
|
||||
duration: Duur
|
||||
note: Notitie
|
||||
id: Identificatie
|
||||
location: Locatie
|
||||
|
||||
Exports of aside activities: Exports van nevenactiviteiten
|
||||
Count aside activities: Aantal nevenactiviteiten
|
||||
Count aside activities by various parameters.: Telt het aantal nevenactiviteiten volgens diverse criteria
|
||||
Average aside activities duration: Gemiddelde duur van nevenactiviteiten
|
||||
Sum aside activities duration: Duur van nevenactiviteiten
|
||||
Sum concerned persons count for aside activities: Aantal betrokken gebruikers bij nevenactiviteiten
|
||||
filter:
|
||||
Filter by aside activity date: Nevenactiviteiten filteren op datum
|
||||
Filter by aside activity type: Nevenactiviteiten filteren op type activiteit
|
||||
'Filtered by aside activity type: only %type%': "Gefilterd op type nevenactiviteit: alleen %type%"
|
||||
Filtered by aside activities between %dateFrom% and %dateTo%: Gefilterd op datum van nevenactiviteit, tussen %dateFrom% en %dateTo%
|
||||
This date should be after the date given in "Implied in an aside activity after this date" field: Deze datum moet later zijn dan de datum in het veld "nevenactiviteiten na deze datum"
|
||||
Aside activities after this date: Nevenactiviteiten na deze datum
|
||||
Aside activities before this date: Nevenactiviteiten vóór deze datum
|
||||
'Filtered aside activity by user: only %users%': "Gefilterd op gebruiker: alleen %users%"
|
||||
Filter aside activity by user: Filteren op gebruiker
|
||||
by_user_job:
|
||||
'Filtered aside activities by user jobs: only %jobs%': "Gefilterd op beroep van gebruikers: alleen %jobs%"
|
||||
Filter by user jobs: Nevenactiviteiten filteren op beroep van gebruikers
|
||||
by_user_scope:
|
||||
'Filtered aside activities by user scope: only %scopes%': "Gefilterd op dienst van gebruikers: alleen %scopes%"
|
||||
Filter by user scope: Nevenactiviteiten filteren op dienst van gebruiker
|
||||
Filter by aside activity location: Nevenactiviteiten filteren op locatie
|
||||
'Filtered by aside activity location: only %location%': "Gefilterd op locatie: alleen %location%"
|
||||
aggregator:
|
||||
Group by aside activity type: Nevenactiviteiten groeperen op type activiteit
|
||||
Group by concerned persons count: Nevenactiviteiten groeperen op aantal betrokken gebruikers
|
||||
Concerned persons count: Aantal betrokken gebruikers
|
||||
Aside activity type: Type nevenactiviteit
|
||||
by_user_job:
|
||||
Aggregate by user job: Nevenactiviteiten groeperen op beroep van gebruikers
|
||||
by_user_scope:
|
||||
Aggregate by user scope: Nevenactiviteiten groeperen op dienst van gebruikers
|
||||
Aside activity location: Locatie van nevenactiviteiten
|
||||
Group by aside activity location: Nevenactiviteiten groeperen op locatie
|
||||
Aside activity localisation: Locatie
|
||||
|
||||
# ROLES
|
||||
CHILL_ASIDE_ACTIVITY_STATS: Statistieken voor nevenactiviteiten
|
||||
|
||||
@@ -74,42 +74,3 @@ The balance: Verschil tussen inkomsten en onkosten
|
||||
|
||||
Valid since %startDate% until %endDate%: Geldig sinds %startDate% tot %endDate%
|
||||
Valid since %startDate%: Geldig sinds %startDate%
|
||||
|
||||
budget:
|
||||
admin:
|
||||
form:
|
||||
Charge_kind_key: Identificatiesleutel
|
||||
Resource_kind_key: Identificatiesleutel
|
||||
This kind must contains only alphabeticals characters, and dashes. This string is in use during document generation. Changes may have side effect on document: Deze sleutel dient om het type last of inkomen te identificeren bij het genereren van documenten. Alleen alfanumerieke tekens zijn toegestaan. Het wijzigen van deze sleutel kan een effect hebben bij het genereren van nieuwe documenten.
|
||||
|
||||
# ROLES
|
||||
Budget elements: Budget
|
||||
CHILL_BUDGET_ELEMENT_CREATE: Inkomsten/last aanmaken
|
||||
CHILL_BUDGET_ELEMENT_DELETE: Inkomsten/last verwijderen
|
||||
CHILL_BUDGET_ELEMENT_SEE: Inkomstenen/lasten bekijken
|
||||
CHILL_BUDGET_ELEMENT_UPDATE: Inkomsten/last bewerken
|
||||
|
||||
## admin
|
||||
|
||||
crud:
|
||||
resource_kind:
|
||||
title_new: Nieuw type inkomsten
|
||||
title_edit: Type inkomsten bewerken
|
||||
charge_kind:
|
||||
title_new: Nieuw type last
|
||||
title_edit: Type last bewerken
|
||||
|
||||
admin:
|
||||
menu:
|
||||
Resource types: Types inkomsten
|
||||
Charge types: Types last
|
||||
title:
|
||||
Charge Type List: Lijst van types last
|
||||
Resource Type List: Lijst van types inkomsten
|
||||
Budget configuration: Configuratie van budgetelementen
|
||||
new:
|
||||
Create a new charge type: Nieuw type last aanmaken
|
||||
Create a new resource type: Nieuw type inkomsten aanmaken
|
||||
form:
|
||||
Choose the type of resource: Kies een type inkomsten
|
||||
Choose the type of charge: Kies een type last
|
||||
|
||||
@@ -1,8 +1,2 @@
|
||||
The amount cannot be empty: Het bedrag mag niet nul of leeg zijn
|
||||
The budget element's end date must be after the start date: De einddatum moet later vallen dan de begindatum
|
||||
|
||||
budget:
|
||||
admin:
|
||||
form:
|
||||
kind:
|
||||
enkel_alphanumeriek
|
||||
The amount cannot be empty: Le montant ne peut pas être vide ou égal à zéro
|
||||
The budget element's end date must be after the start date: La date de fin doit être après la date de début
|
||||
@@ -12,7 +12,6 @@ declare(strict_types=1);
|
||||
namespace Chill\CalendarBundle\Controller;
|
||||
|
||||
use Chill\CalendarBundle\Repository\CalendarRepository;
|
||||
use Chill\CalendarBundle\Repository\InviteRepository;
|
||||
use Chill\MainBundle\CRUD\Controller\ApiController;
|
||||
use Chill\MainBundle\Entity\User;
|
||||
use Chill\MainBundle\Serializer\Model\Collection;
|
||||
@@ -24,10 +23,7 @@ use Symfony\Component\Routing\Annotation\Route;
|
||||
|
||||
class CalendarAPIController extends ApiController
|
||||
{
|
||||
public function __construct(
|
||||
private readonly CalendarRepository $calendarRepository,
|
||||
private readonly InviteRepository $inviteRepository,
|
||||
) {}
|
||||
public function __construct(private readonly CalendarRepository $calendarRepository) {}
|
||||
|
||||
#[Route(path: '/api/1.0/calendar/calendar/by-user/{id}.{_format}', name: 'chill_api_single_calendar_list_by-user', requirements: ['_format' => 'json'])]
|
||||
public function listByUser(User $user, Request $request, string $_format): JsonResponse
|
||||
@@ -56,37 +52,16 @@ class CalendarAPIController extends ApiController
|
||||
throw new BadRequestHttpException('dateTo not parsable');
|
||||
}
|
||||
|
||||
// Get calendar items where user is the main user
|
||||
$ownCalendars = $this->calendarRepository->findByUser(
|
||||
$total = $this->calendarRepository->countByUser($user, $dateFrom, $dateTo);
|
||||
$paginator = $this->getPaginatorFactory()->create($total);
|
||||
$ranges = $this->calendarRepository->findByUser(
|
||||
$user,
|
||||
$dateFrom,
|
||||
$dateTo
|
||||
$dateTo,
|
||||
$paginator->getItemsPerPage(),
|
||||
$paginator->getCurrentPageFirstItemNumber()
|
||||
);
|
||||
|
||||
// Get calendar items from accepted invites
|
||||
$acceptedInvites = $this->inviteRepository->findAcceptedInvitesByUserAndDateRange($user, $dateFrom, $dateTo);
|
||||
$inviteCalendars = array_map(fn ($invite) => $invite->getCalendar(), $acceptedInvites);
|
||||
|
||||
// Merge
|
||||
$allCalendars = array_merge($ownCalendars, $inviteCalendars);
|
||||
$uniqueCalendars = [];
|
||||
$seenIds = [];
|
||||
|
||||
foreach ($allCalendars as $calendar) {
|
||||
$id = $calendar->getId();
|
||||
if (!in_array($id, $seenIds, true)) {
|
||||
$seenIds[] = $id;
|
||||
$uniqueCalendars[] = $calendar;
|
||||
}
|
||||
}
|
||||
|
||||
$total = count($uniqueCalendars);
|
||||
$paginator = $this->getPaginatorFactory()->create($total);
|
||||
|
||||
$offset = $paginator->getCurrentPageFirstItemNumber();
|
||||
$limit = $paginator->getItemsPerPage();
|
||||
$ranges = array_slice($uniqueCalendars, $offset, $limit);
|
||||
|
||||
$collection = new Collection($ranges, $paginator);
|
||||
|
||||
return $this->json($collection, Response::HTTP_OK, [], ['groups' => ['calendar:light']]);
|
||||
|
||||
@@ -13,7 +13,6 @@ namespace Chill\CalendarBundle\Controller;
|
||||
|
||||
use Chill\CalendarBundle\Entity\Calendar;
|
||||
use Chill\CalendarBundle\Form\CalendarType;
|
||||
use Chill\CalendarBundle\Form\CancelType;
|
||||
use Chill\CalendarBundle\RemoteCalendar\Connector\RemoteCalendarConnectorInterface;
|
||||
use Chill\CalendarBundle\Repository\CalendarACLAwareRepositoryInterface;
|
||||
use Chill\CalendarBundle\Security\Voter\CalendarVoter;
|
||||
@@ -31,7 +30,6 @@ use Chill\PersonBundle\Repository\PersonRepository;
|
||||
use Chill\PersonBundle\Security\Authorization\AccompanyingPeriodVoter;
|
||||
use Chill\PersonBundle\Security\Authorization\PersonVoter;
|
||||
use Chill\ThirdPartyBundle\Entity\ThirdParty;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use http\Exception\UnexpectedValueException;
|
||||
use Psr\Log\LoggerInterface;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
@@ -62,7 +60,6 @@ class CalendarController extends AbstractController
|
||||
private readonly UserRepositoryInterface $userRepository,
|
||||
private readonly TranslatorInterface $translator,
|
||||
private readonly \Doctrine\Persistence\ManagerRegistry $managerRegistry,
|
||||
private readonly EntityManagerInterface $em,
|
||||
) {}
|
||||
|
||||
/**
|
||||
@@ -114,55 +111,6 @@ class CalendarController extends AbstractController
|
||||
]);
|
||||
}
|
||||
|
||||
#[Route(path: '/{_locale}/calendar/calendar/{id}/cancel', name: 'chill_calendar_calendar_cancel')]
|
||||
public function cancelAction(Calendar $calendar, Request $request): Response
|
||||
{
|
||||
// Deal with sms being sent or not
|
||||
// Communicate cancellation with the remote calendar.
|
||||
|
||||
$this->denyAccessUnlessGranted(CalendarVoter::EDIT, $calendar);
|
||||
|
||||
[$person, $accompanyingPeriod] = [$calendar->getPerson(), $calendar->getAccompanyingPeriod()];
|
||||
|
||||
$form = $this->createForm(CancelType::class, $calendar);
|
||||
$form->add('submit', SubmitType::class);
|
||||
|
||||
if ($accompanyingPeriod instanceof AccompanyingPeriod) {
|
||||
$view = '@ChillCalendar/Calendar/cancelCalendarByAccompanyingCourse.html.twig';
|
||||
$redirectRoute = $this->generateUrl('chill_calendar_calendar_list_by_period', ['id' => $accompanyingPeriod->getId()]);
|
||||
} elseif ($person instanceof Person) {
|
||||
$view = '@ChillCalendar/Calendar/cancelCalendarByPerson.html.twig';
|
||||
$redirectRoute = $this->generateUrl('chill_calendar_calendar_list_by_person', ['id' => $person->getId()]);
|
||||
} else {
|
||||
throw new \RuntimeException('nor person or accompanying period');
|
||||
}
|
||||
|
||||
$form->handleRequest($request);
|
||||
|
||||
if ($form->isSubmitted() && $form->isValid()) {
|
||||
|
||||
$this->logger->notice('A calendar event has been cancelled', [
|
||||
'by_user' => $this->getUser()->getUsername(),
|
||||
'calendar_id' => $calendar->getId(),
|
||||
]);
|
||||
|
||||
$calendar->setStatus($calendar::STATUS_CANCELED);
|
||||
$calendar->setSmsStatus($calendar::SMS_CANCEL_PENDING);
|
||||
$this->em->flush();
|
||||
|
||||
$this->addFlash('success', $this->translator->trans('chill_calendar.calendar_canceled'));
|
||||
|
||||
return new RedirectResponse($redirectRoute);
|
||||
}
|
||||
|
||||
return $this->render($view, [
|
||||
'calendar' => $calendar,
|
||||
'form' => $form->createView(),
|
||||
'accompanyingCourse' => $accompanyingPeriod,
|
||||
'person' => $person,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Edit a calendar item.
|
||||
*/
|
||||
@@ -318,7 +266,7 @@ class CalendarController extends AbstractController
|
||||
}
|
||||
|
||||
if (!$this->getUser() instanceof User) {
|
||||
throw new UnauthorizedHttpException('you are not a user');
|
||||
throw new UnauthorizedHttpException('you are not an user');
|
||||
}
|
||||
|
||||
$view = '@ChillCalendar/Calendar/listByUser.html.twig';
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
namespace Chill\CalendarBundle\Controller;
|
||||
|
||||
use Chill\CalendarBundle\Entity\Calendar;
|
||||
use Chill\CalendarBundle\Repository\InviteRepository;
|
||||
use Chill\DocGeneratorBundle\Repository\DocGeneratorTemplateRepositoryInterface;
|
||||
use Chill\MainBundle\Entity\User;
|
||||
use Chill\MainBundle\Pagination\PaginatorFactory;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
|
||||
use Symfony\Component\Routing\Annotation\Route;
|
||||
|
||||
class MyInvitationsController extends AbstractController
|
||||
{
|
||||
public function __construct(private readonly InviteRepository $inviteRepository, private readonly PaginatorFactory $paginator, private readonly DocGeneratorTemplateRepositoryInterface $docGeneratorTemplateRepository) {}
|
||||
|
||||
#[Route(path: '/{_locale}/calendar/invitations/my', name: 'chill_calendar_invitations_list_my')]
|
||||
public function myInvitations(Request $request): Response
|
||||
{
|
||||
$this->denyAccessUnlessGranted('ROLE_USER');
|
||||
|
||||
$user = $this->getUser();
|
||||
|
||||
if (!$user instanceof User) {
|
||||
throw new UnauthorizedHttpException('you are not a user');
|
||||
}
|
||||
|
||||
$total = count($this->inviteRepository->findBy(['user' => $user]));
|
||||
$paginator = $this->paginator->create($total);
|
||||
|
||||
$invitations = $this->inviteRepository->findBy(
|
||||
['user' => $user],
|
||||
['createdAt' => 'DESC'],
|
||||
$paginator->getItemsPerPage(),
|
||||
$paginator->getCurrentPageFirstItemNumber()
|
||||
);
|
||||
|
||||
$view = '@ChillCalendar/Invitations/listByUser.html.twig';
|
||||
|
||||
return $this->render($view, [
|
||||
'invitations' => $invitations,
|
||||
'paginator' => $paginator,
|
||||
'templates' => $this->docGeneratorTemplateRepository->findByEntity(Calendar::class),
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -35,7 +35,7 @@ class LoadCancelReason extends Fixture implements FixtureGroupInterface
|
||||
$arr = [
|
||||
['name' => CancelReason::CANCELEDBY_USER],
|
||||
['name' => CancelReason::CANCELEDBY_PERSON],
|
||||
['name' => CancelReason::CANCELEDBY_OTHER],
|
||||
['name' => CancelReason::CANCELEDBY_DONOTCOUNT],
|
||||
];
|
||||
|
||||
foreach ($arr as $a) {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user