mirror of
				https://gitlab.com/Chill-Projet/chill-bundles.git
				synced 2025-10-31 09:18:24 +00:00 
			
		
		
		
	Compare commits
	
		
			342 Commits
		
	
	
		
			v3.12.0
			...
			create-adm
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 19785795ad | |||
| e8450a519d | |||
| c66f0122bf | |||
| 37291b2756 | |||
| a88575463b | |||
| 6d2e78ce55 | |||
| 61ca700bbe | |||
|  | b43aeebc3c | ||
| 056e2dcc5f | |||
| e57d1ac696 | |||
| 0eff1d2e79 | |||
| 3928b2cc7a | |||
| 4f51ef81ad | |||
| 4637dc692c | |||
| 38935edb93 | |||
|  | e1ef65d4ca | ||
| ec9d0be70b | |||
|  | 0ba2cbc1e8 | ||
| e87429933a | |||
| 8e2e676e3d | |||
| e12ad563a3 | |||
|  | 711aa8db9b | ||
| e78d44953f | |||
| 18f67801c7 | |||
| c815e6bc69 | |||
| 807f2711fe | |||
|  | cd594cd580 | ||
| ac12b8cdcf | |||
| 9c1611d052 | |||
| fb6b26bfb5 | |||
| c5cedb8bd6 | |||
| 2665e43a61 | |||
| 90e3043c3d | |||
| af13bf9088 | |||
| 4aa65d69c7 | |||
| 9e33aec594 | |||
| f88bc7e9f0 | |||
| 8e78c41549 | |||
| 6e36771349 | |||
| 7a82cae155 | |||
| dfab223391 | |||
| 539752485c | |||
| d204df0316 | |||
|  | 82c02f442b | ||
| 25561cdf63 | |||
| 10b73e06e1 | |||
|  | e7c04e34a9 | ||
| f32a9dc7bc | |||
| ea06a96f91 | |||
| 76433e2512 | |||
| 1fa464b87a | |||
| 3b75f43e80 | |||
| a40eb95c43 | |||
| 8429c6e693 | |||
| 6db7f6827c | |||
| 3c60c57985 | |||
| 10aa36aae0 | |||
| eed9913a49 | |||
| 1a847d36a0 | |||
| d916962d9b | |||
| 1092fc64ae | |||
| 4e99b6ecbd | |||
| 60d107b541 | |||
| 4c3befe489 | |||
| e176319775 | |||
| 5d810b4230 | |||
| 52b8eea069 | |||
| 4bebeaeaaa | |||
| 3969e12633 | |||
| d60312d4a2 | |||
| d2454ae134 | |||
| 17c2cb1fdc | |||
| 94d7a2a0bb | |||
| aef1efc6cd | |||
| dd0c662c9e | |||
| 6b1696b62e | |||
| c4b760c452 | |||
| 69fe2a8256 | |||
| 8c98242896 | |||
| 7eecfd3882 | |||
| 6713658569 | |||
| 342b786106 | |||
| 80a7437769 | |||
| 8a38ce1a5c | |||
| 5d94bf0556 | |||
| bb71e084b8 | |||
| 27f0bf28e9 | |||
| 383f588795 | |||
| e7a1ff1ac8 | |||
| adc9c47d0a | |||
| e594b65d1e | |||
| c0826bc65c | |||
| 904f4e5ed9 | |||
| 481f82b4c7 | |||
| f5668592ca | |||
| 164beee7c6 | |||
|  | 4d96eb9457 | ||
| aa085a1562 | |||
| 2754251fdc | |||
| 2f6cef4238 | |||
| 2309636eae | |||
| 56ec8fb516 | |||
| fe6e6e54c1 | |||
| 2a09594b4a | |||
| 7c798e1f63 | |||
| ab8da4ab7a | |||
| 5bdb2df929 | |||
| e3a6b60fa2 | |||
| fe2eba3b29 | |||
|  | 61d1232e31 | ||
| 6594d4f6a6 | |||
| 1a66a9e864 | |||
| 1b74c119dc | |||
| 14d88810f3 | |||
| 445a2c9358 | |||
| c8baf0a8aa | |||
| faed443a96 | |||
| bbf387d96f | |||
|  | b7c9b60744 | ||
| 5f01673404 | |||
| 63d0a52ea1 | |||
| 2bd303bbbe | |||
| c5e6122d2c | |||
| 088b876e20 | |||
| 3400656d7c | |||
| 837089ff5d | |||
| 568c8be7fd | |||
| 538ecc42ea | |||
| 15d26d4b06 | |||
| d8bd9bd7cd | |||
| dcdfba5ccd | |||
| 0204bdd38d | |||
| f383fab578 | |||
| f3cc4a89af | |||
| 703f5dc32d | |||
| b870e71f77 | |||
| 392fd01b56 | |||
| a7e278204f | |||
| 4cfdcb2f02 | |||
| 3b82ab0e7f | |||
| ccfae1dc75 | |||
| 8bc16dadb0 | |||
| 35844f3b73 | |||
| 7506b918d7 | |||
| c4cc0baa8e | |||
| aed114c75c | |||
| cfba291f2c | |||
|  | 04438c09d3 | ||
| 2a54d1b909 | |||
|  | 628eeac5e0 | ||
| a2263b3fa1 | |||
| 74796d0fb0 | |||
| c19481e40a | |||
|  | 6eeb717b1a | ||
| beb7c462da | |||
|  | dbf363a9e8 | ||
| 64a2f7c9ed | |||
| e592b89c94 | |||
| f26d9739c8 | |||
| afa5edc1d8 | |||
| 42d6c9e672 | |||
| 2b22d4cb7c | |||
| c8e5d0eb37 | |||
| 2bf8ad5d6c | |||
| 11698a52e3 | |||
| 70955573e8 | |||
|  | 3df4043eb9 | ||
| 06e8264dde | |||
| 70e75adb7d | |||
| 6f7015b152 | |||
| 65dde1e6a0 | |||
| d193c50922 | |||
| 840ef6eed8 | |||
| b4bbb1a456 | |||
| 606435a6b3 | |||
| b451d2c4a3 | |||
| 4f93150874 | |||
| 404143f8a6 | |||
| ec957a2fe3 | |||
| 8ed5e35f1a | |||
| ec37676dab | |||
| 2d8cda30b9 | |||
| 0566ab0910 | |||
|  | f4eeee1598 | ||
| 33cf16fc13 | |||
| 0a331aab37 | |||
| d43b739654 | |||
| c72432efae | |||
| 95975fae55 | |||
| 95a7efa138 | |||
| 45e193ff6d | |||
| dfc146ff3f | |||
| c2842148c6 | |||
| 10e4c7da23 | |||
| b41fcf66a9 | |||
|  | a8dd1b3548 | ||
| f680a35f49 | |||
| 7d0fe06651 | |||
| fca10ada71 | |||
| a35d456308 | |||
| 2b99a480ac | |||
| 7633e587bb | |||
| fc61dfdf3a | |||
| f1a5b5c49e | |||
| ec685dcd47 | |||
| 631ae3eedd | |||
| 440a7837ac | |||
| e0abf34784 | |||
| 377ae9a9dc | |||
| 034dc30e30 | |||
| d615111a0f | |||
| ffb756c712 | |||
| 69daccb860 | |||
| 16435423cf | |||
| 697b4ab436 | |||
| 67d804e28e | |||
| cf41fa9574 | |||
| b8b325f7d7 | |||
| e97bd8c4ef | |||
| e28d7df533 | |||
| 4b20b1bc01 | |||
| b15733076c | |||
| 25be5c9ea3 | |||
| b035020c6f | |||
| 128101dc46 | |||
| 5f2711023e | |||
| bdf2ed4bbd | |||
| 1df542603e | |||
| 80bcc68ce5 | |||
| 154fc3e2f6 | |||
| e45af94c78 | |||
| 166a6fde20 | |||
| 631f047338 | |||
| a777588bb8 | |||
| ca78d112c2 | |||
| bcfd317d83 | |||
| 348740f073 | |||
| 0d74f0980f | |||
| be19dc00db | |||
| 643028ffd6 | |||
| ac4e2e5bf2 | |||
| 498572b96e | |||
| d2a61ce69b | |||
| a9c0567ee1 | |||
| 76cec5b5a8 | |||
| efe8a67697 | |||
| 26dfa9b028 | |||
| 50025044d3 | |||
| e6202a2e34 | |||
| b863bd967d | |||
| e65bcf7275 | |||
| e00ece4200 | |||
| 640fd71402 | |||
| aae50ca290 | |||
| 1fa483598b | |||
| e4b6a468f8 | |||
|  | 66c7758023 | ||
|  | 4750d2c24e | ||
|  | ca05e3d979 | ||
|  | a20f9b4f86 | ||
|  | c73c1eb8d5 | ||
|  | 8778bb0731 | ||
|  | c7d20eebc5 | ||
|  | b9e130c159 | ||
|  | 3e8bc94af3 | ||
|  | 0c914c9f9f | ||
|  | 580a60c939 | ||
|  | 4996ac3b7c | ||
|  | 2a23bf19cb | ||
|  | 650d2596d9 | ||
|  | 2bdd5a329e | ||
| 78d1776733 | |||
| 66dc603c85 | |||
| 3a8154ecce | |||
| c81828e04f | |||
|  | ec17dd7de2 | ||
| 76c076a5f3 | |||
|  | f0045edd6c | ||
|  | d00b76ffcd | ||
|  | 8991f0ef3f | ||
|  | d6f5eae0c9 | ||
|  | 821fce3dd8 | ||
|  | 1d33ae1e39 | ||
|  | 19af0feb57 | ||
|  | 1c09e9a692 | ||
|  | d72e748388 | ||
|  | ab850b7b70 | ||
|  | 3f9745d8cf | ||
|  | 473765366a | ||
|  | 6500c24a7f | ||
|  | 1d00457141 | ||
|  | eb0bf56cff | ||
|  | 7b8cd90cf1 | ||
|  | a27d92aba0 | ||
|  | 85bdfb9e21 | ||
|  | 4cffcf4de1 | ||
|  | b2587a688f | ||
|  | c9f0e9843b | ||
|  | b40ad9e445 | ||
|  | 3e10e47e29 | ||
|  | 2a1963e993 | ||
| 34c171659b | |||
| 2d8b960d9e | |||
| 831ae03431 | |||
| 45828174d1 | |||
| ed45f14a45 | |||
| fa67835690 | |||
| b434d38091 | |||
|  | 800a952532 | ||
| 9f355032a8 | |||
| 0bc6e62d4d | |||
| 46fb1c04b5 | |||
| 3b2c3d1464 | |||
|  | 0bd6038160 | ||
|  | baab8e94ce | ||
| e2deb55fdb | |||
|  | 2cdfb50058 | ||
| 39d701feb2 | |||
| 613ee8b186 | |||
| 56a1a488de | |||
| 3f789ad0f4 | |||
| 467bea7cde | |||
| 670b8eb82b | |||
| a9760b323f | |||
| 71a3a1924a | |||
| ecdc1e25bf | |||
| dd37427be1 | |||
| c8467df1b1 | |||
| 4c89a954fa | |||
| 7c1f3b114d | |||
| 36bc4dab24 | |||
| 4b30d92282 | |||
| 75fbec5489 | |||
| 912fdd6349 | |||
| 5832542978 | |||
| 5c3585a1ed | |||
| a2f1e20ddf | |||
| 4d67702a76 | |||
| 18e442db29 | |||
|  | deb3d92189 | ||
| a59ea7db31 | |||
| a738b0cac9 | 
							
								
								
									
										6
									
								
								.changes/unreleased/Feature-20240530-160003.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.changes/unreleased/Feature-20240530-160003.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| kind: Feature | ||||
| body: | | ||||
|   Upgrade import of address list to the last version of compiled addresses of belgian-best-address | ||||
| time: 2024-05-30T16:00:03.440767606+02:00 | ||||
| custom: | ||||
|   Issue: "" | ||||
							
								
								
									
										6
									
								
								.changes/unreleased/Feature-20240531-190242.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.changes/unreleased/Feature-20240531-190242.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| kind: Feature | ||||
| body: | | ||||
|   Upgrade CKEditor and refactor configuration with use of typescript | ||||
| time: 2024-05-31T19:02:42.776662753+02:00 | ||||
| custom: | ||||
|   Issue: "" | ||||
							
								
								
									
										6
									
								
								.changes/unreleased/Feature-20250904-181032.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.changes/unreleased/Feature-20250904-181032.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| kind: Feature | ||||
| body: Add a command to generate a list of permissions | ||||
| time: 2025-09-04T18:10:32.334524026+02:00 | ||||
| custom: | ||||
|     Issue: "" | ||||
|     SchemaChange: No schema change | ||||
							
								
								
									
										6
									
								
								.changes/unreleased/Feature-20251007-155945.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.changes/unreleased/Feature-20251007-155945.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| kind: Feature | ||||
| body: Admin interface for Motive entity | ||||
| time: 2025-10-07T15:59:45.597029709+02:00 | ||||
| custom: | ||||
|     Issue: "" | ||||
|     SchemaChange: No schema change | ||||
							
								
								
									
										6
									
								
								.changes/unreleased/Feature-20251022-111552.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.changes/unreleased/Feature-20251022-111552.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| kind: Feature | ||||
| body: Add an admin interface for Motive entity | ||||
| time: 2025-10-22T11:15:52.13937955+02:00 | ||||
| custom: | ||||
|     Issue: "" | ||||
|     SchemaChange: Add columns or tables | ||||
							
								
								
									
										3
									
								
								.changes/v3.12.1.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.changes/v3.12.1.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| ## v3.12.1 - 2025-06-30 | ||||
| ### Fixed | ||||
| * Fix loading of the list of documents    | ||||
							
								
								
									
										74
									
								
								.changes/v4.0.0.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								.changes/v4.0.0.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | ||||
| ## 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`) | ||||
|  | ||||
|  | ||||
							
								
								
									
										4
									
								
								.changes/v4.0.1.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.changes/v4.0.1.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| ## v4.0.1 - 2025-07-08 | ||||
| ### Fixed | ||||
| * Fix package.json for compilation | ||||
|     | ||||
							
								
								
									
										4
									
								
								.changes/v4.0.2.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.changes/v4.0.2.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| ## v4.0.2 - 2025-07-09 | ||||
| ### Fixed | ||||
| * Fix add missing translation    | ||||
| * Fix the transfer of evaluations and documents during of accompanyingperiodwork    | ||||
							
								
								
									
										12
									
								
								.changes/v4.1.0.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								.changes/v4.1.0.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| ## 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    | ||||
							
								
								
									
										10
									
								
								.changes/v4.2.0.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								.changes/v4.2.0.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| ## 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 | ||||
							
								
								
									
										6
									
								
								.changes/v4.2.1.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.changes/v4.2.1.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| ## 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 | ||||
|     | ||||
| @@ -19,11 +19,11 @@ max_line_length = 80 | ||||
| [COMMIT_EDITMSG] | ||||
| max_line_length = 0 | ||||
|  | ||||
| [*.{js, vue, ts}] | ||||
| [*.{js,vue,ts}] | ||||
| indent_size = 2 | ||||
| indent_style = space | ||||
|  | ||||
| [.rst] | ||||
| ident_size = 3 | ||||
| ident_style = space | ||||
| [*.rst] | ||||
| indent_size = 3 | ||||
| indent_style = space | ||||
|  | ||||
|   | ||||
| @@ -7,14 +7,6 @@ | ||||
|         "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, | ||||
| @@ -127,46 +119,6 @@ | ||||
|         "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, | ||||
| @@ -399,14 +351,6 @@ | ||||
|         "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, | ||||
| @@ -615,14 +559,6 @@ | ||||
|         "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, | ||||
| @@ -983,22 +919,6 @@ | ||||
|         "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, | ||||
| @@ -1089,115 +1009,19 @@ | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue", | ||||
|         "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": 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, | ||||
|         "line": 516, | ||||
|         "column": 21, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"context\" prop.", | ||||
|         "hash": "0d3f40c47974a4371072b3b9ee04b197c830162d" | ||||
|         "hash": "984c4203f2ac1e1bb65f9ce76ecd03b763cfaa83" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue", | ||||
|         "line": 491, | ||||
|         "line": 517, | ||||
|         "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" | ||||
|         "hash": "c9fb019bc21bfa77d989ed596913b99dd653c594" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressMore.vue", | ||||
| @@ -1224,204 +1048,180 @@ | ||||
|         "hash": "2d5a5e680ff207ad97c7e7b7d999064b561dfd8a" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", | ||||
|         "line": 106, | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressMore.vue", | ||||
|         "line": 149, | ||||
|         "column": 17, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "d52356f2af31d0167c02330ec22d09fbfa6b2b9f" | ||||
|         "hash": "e4c1ecd7ae77d46ac3625c5bbe92a24d6a964db9" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", | ||||
|         "line": 114, | ||||
|         "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": "c8e8e06f370f93bf05867e93b5f037dfa46937b1" | ||||
|         "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" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", | ||||
|         "line": 128, | ||||
|         "column": 13, | ||||
|         "line": 130, | ||||
|         "column": 17, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "9abaf71ca4b4f292b3b01e724d0a7733365e71f1" | ||||
|         "hash": "239ac02a02694d5b20ab30d4c7ce5838c51d1515" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", | ||||
|         "line": 129, | ||||
|         "column": 13, | ||||
|         "line": 138, | ||||
|         "column": 17, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "0b0743959778a9e3d93089b132608816ee4e6646" | ||||
|         "hash": "a54f9bc6d1edfa4df93c7dd7d409cfef3fccf99e" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", | ||||
|         "line": 132, | ||||
|         "line": 152, | ||||
|         "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" | ||||
|         "hash": "74a5f664d18f3916ea908897fcd0291cb0128f29" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", | ||||
|         "line": 153, | ||||
|         "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": 154, | ||||
|         "column": 37, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "596c4b180b926b7829f987384328bf5636cd367a" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", | ||||
|         "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": "d92b92a25043244cca809bd129633b7e024e26b4" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", | ||||
|         "line": 190, | ||||
|         "column": 17, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "dd9a85ea740742d620e864796f67c5bff834486d" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", | ||||
|         "line": 191, | ||||
|         "column": 17, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "e3e59960d0d50709a57b336f66b586710b774892" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", | ||||
|         "line": 192, | ||||
|         "column": 17, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "fe11b0e54396511e7b3b08615a78d22fc27e2fad" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", | ||||
|         "line": 222, | ||||
|         "column": 13, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "63c14c2150c33ec701bc4a0ff94efde69537d490" | ||||
|         "hash": "740ea5d793c7a34c9f352d8b333f3aa04cc80ee8" | ||||
|     }, | ||||
|     { | ||||
|         "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, | ||||
|         "column": 37, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "0ec402e43cb08bf129e0737c0d2c4f6d0c7af8bd" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", | ||||
|         "line": 196, | ||||
|         "column": 41, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "ec178d33e067aac892e015002afb6f3a2ff98762" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", | ||||
|         "line": 214, | ||||
|         "column": 17, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "c0f4e5454e672b6064eb9cf6c235c6810f7bfa80" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", | ||||
|         "line": 215, | ||||
|         "column": 17, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "e3dd840d2474f9865a45822872bf9ecfb15961d7" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", | ||||
|         "line": 216, | ||||
|         "column": 17, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "a32a60382b145cc7a4a7ebe01ec435b8e3103320" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", | ||||
|         "line": 246, | ||||
|         "column": 13, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "082447e5c731012f3acc282943502775dfd24797" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", | ||||
|         "line": 96, | ||||
|         "line": 118, | ||||
|         "column": 20, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "d2a9fdaeef0e2810f480022d4c6f99e4f76a818e" | ||||
|         "hash": "d4fba4fe09af3c0937c0dd164928c8930c1591b5" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", | ||||
|         "line": 96, | ||||
|         "line": 118, | ||||
|         "column": 20, | ||||
|         "ruleId": "vue/no-side-effects-in-computed-properties", | ||||
|         "message": "Unexpected side effect in \"cities\" computed property.", | ||||
|         "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" | ||||
|         "hash": "1113a114d5aaf9f32f442916d25458541c5af35c" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", | ||||
|         "line": 124, | ||||
|         "column": 13, | ||||
|         "column": 17, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "281f918da00635079501418b1e6b2c05b62eb4a7" | ||||
|         "hash": "fa56a7c93583f0a9d0c2ecac10228c4f4fc1bc3a" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", | ||||
|         "line": 125, | ||||
|         "column": 13, | ||||
|         "line": 132, | ||||
|         "column": 17, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "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" | ||||
|         "hash": "9fe87937ea67d1dae95fb3d44d4be0da2eba0905" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", | ||||
| @@ -1441,115 +1241,139 @@ | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", | ||||
|         "line": 149, | ||||
|         "column": 17, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "1e7b1ad55866f708baaca72dfa4ff26d6f8e5d21" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", | ||||
|         "line": 152, | ||||
|         "line": 148, | ||||
|         "column": 13, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "84779331536ffceec8d4a8c5ca4307310b882549" | ||||
|         "hash": "ab4f478fbfbc954b8dff75176dcd432f9ff28cfc" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", | ||||
|         "line": 161, | ||||
|         "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, | ||||
|         "column": 13, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "0789999841be671a4d8ab080d6fdb679f843eb52" | ||||
|         "hash": "8aa37d2d4f011773e68838a2c88017875de563b5" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", | ||||
|         "line": 170, | ||||
|         "column": 51, | ||||
|         "ruleId": "@typescript-eslint/no-unused-vars", | ||||
|         "message": "'reject' is defined but never used.", | ||||
|         "hash": "bbb17afa114f016e2058d90aa32d2a625804f0d1" | ||||
|         "line": 168, | ||||
|         "column": 13, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "a4827a357e52a51fa9262319114d81a130296acf" | ||||
|     }, | ||||
|     { | ||||
|         "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" | ||||
|     }, | ||||
|     { | ||||
|         "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": "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" | ||||
|         "hash": "5d1f97e4d7d9f47399d312e8b9f95ef9e3843b8c" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", | ||||
|         "line": 213, | ||||
|         "column": 17, | ||||
|         "column": 37, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "c399a43fa797a8ce61c9d96a644a39cc84a387b7" | ||||
|         "hash": "c1df874f790ef0c036bf58ae8a8db1ee173685d4" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", | ||||
|         "line": 245, | ||||
|         "line": 232, | ||||
|         "column": 17, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "476e6588a28ac9382e8b9d2e63a8babecd23bad8" | ||||
|     }, | ||||
|     { | ||||
|         "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, | ||||
|         "column": 13, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "04337a07944caaa4819cfebcf29e1a7cbfdf248b" | ||||
|         "hash": "2700f258396516a2fe971618fafbcdf72cdda3ab" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CountrySelection.vue", | ||||
|         "line": 76, | ||||
|         "line": 94, | ||||
|         "column": 13, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "373a2e31f110d138c66d77f1faf5dc61545c55af" | ||||
|         "hash": "4be1b0592efa775092a91a1d744e16ce98bd216e" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CountrySelection.vue", | ||||
|         "line": 81, | ||||
|         "line": 99, | ||||
|         "column": 13, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "421eb6a63224b4b1d81b216677a710c5c99ddee3" | ||||
|         "hash": "19b54b6d76c30249d520a296f826eda9d6eb0668" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/DatePane.vue", | ||||
| @@ -1569,19 +1393,19 @@ | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/EditPane.vue", | ||||
|         "line": 155, | ||||
|         "line": 169, | ||||
|         "column": 17, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "b3a822914fcb5e2fcf28efc331a45b9205002eeb" | ||||
|         "hash": "dcb7b34098062760ddbb849655a5bb3ca65c36d3" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/EditPane.vue", | ||||
|         "line": 164, | ||||
|         "line": 178, | ||||
|         "column": 17, | ||||
|         "ruleId": "vue/no-mutating-props", | ||||
|         "message": "Unexpected mutation of \"entity\" prop.", | ||||
|         "hash": "72c7d850f6cdeaf65b373a33234222f9766ee30b" | ||||
|         "hash": "86b3ecf201025cac36878c5e4bf8850fb9d58cb5" | ||||
|     }, | ||||
|     { | ||||
|         "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/index.js", | ||||
| @@ -1631,14 +1455,6 @@ | ||||
|         "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, | ||||
| @@ -1727,14 +1543,6 @@ | ||||
|         "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, | ||||
| @@ -1767,14 +1575,6 @@ | ||||
|         "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, | ||||
| @@ -1815,22 +1615,6 @@ | ||||
|         "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, | ||||
| @@ -1847,38 +1631,6 @@ | ||||
|         "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, | ||||
| @@ -1887,22 +1639,6 @@ | ||||
|         "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, | ||||
| @@ -1918,45 +1654,5 @@ | ||||
|         "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,6 +18,9 @@ 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 | ||||
|   | ||||
| @@ -27,11 +27,11 @@ Chill is a comprehensive web application built as a set of Symfony bundles. It i | ||||
|  | ||||
| ## Project 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. | ||||
| 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. | ||||
|  | ||||
| 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 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). | ||||
| - 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). | ||||
| - `/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 fill a "Command", and a "CommandHandler" handle this command. They are savec in the `src/Bundle/ChillTicketBundle/src/Action` directory. | ||||
| 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. | ||||
|  | ||||
| ## Development Guidelines | ||||
|  | ||||
| ### Building and Configuration Instructions | ||||
|  | ||||
| All the command should be run through the `symfony` command, which will configure the required variables. | ||||
| All the commands 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 | ||||
|    ``` | ||||
|  | ||||
| 5. **Set Up the Database**: | ||||
| 6. **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 | ||||
|    ``` | ||||
|  | ||||
| 6. **Build Assets**: | ||||
| 7. **Build Assets**: | ||||
|    ```bash | ||||
|    nvm use 20 | ||||
|    yarn run encore dev | ||||
|    ``` | ||||
|  | ||||
| 7. **Start the Development Server**: | ||||
| 8. **Start the Development Server**: | ||||
|    ```bash | ||||
|    symfony server:start -d | ||||
|    ``` | ||||
|  | ||||
| #### Docker Setup | ||||
|  | ||||
| The project includes Docker configuration for easier development: | ||||
| The project includes a Docker configuration for easier development: | ||||
|  | ||||
| 1. **Start Docker Services**: | ||||
|    ```bash | ||||
| @@ -153,9 +153,9 @@ Key configuration files: | ||||
|  | ||||
| Each time a doctrine entity is created, we generate migration to adapt the database. | ||||
|  | ||||
| The migration are 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, do not forget to quote the `\` (`\` must become `\\` in your command). | ||||
| 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 you that it is ok): | ||||
| 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`; | ||||
| @@ -183,23 +183,60 @@ Once created the, comment's classes should be removed and a description of the c | ||||
|  | ||||
| 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 database, but usually possible in services. | ||||
| 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: so, do not change the directory to any bundle directory before running tests). | ||||
|  | ||||
| ```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 | ||||
|  | ||||
| @@ -254,7 +291,7 @@ class TicketTest extends TestCase | ||||
|  | ||||
| #### Test Database | ||||
|  | ||||
| For tests that require a database, the project uses postgresql database filled by 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 a postgresql database filled with fixtures (usage of doctrine-fixtures). You can configure a different database for testing in the `.env.test` file. | ||||
|  | ||||
| ### Code Quality Tools | ||||
|  | ||||
|   | ||||
							
								
								
									
										4
									
								
								.prettierrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.prettierrc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| { | ||||
|   "tabWidth": 2, | ||||
|   "useTabs": false | ||||
| } | ||||
							
								
								
									
										30
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| { | ||||
|     // Use IntelliSense to learn about possible attributes. | ||||
|     // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 | ||||
|     "version": "0.2.0", | ||||
|     "configurations": [ | ||||
|         { | ||||
|             "name": "Chill Debug", | ||||
|             "type": "php", | ||||
|             "request": "launch", | ||||
|             "port": 9000, | ||||
|             "pathMappings": { | ||||
|                 "/var/www/html": "${workspaceFolder}" | ||||
|             }, | ||||
|             "preLaunchTask": "symfony" | ||||
|         }, | ||||
|         { | ||||
|             "name": "Yarn Encore Dev (Watch)", | ||||
|             "type": "node-terminal", | ||||
|             "request": "launch", | ||||
|             "command": "yarn encore dev --watch", | ||||
|             "cwd": "${workspaceFolder}" | ||||
|         } | ||||
|     ], | ||||
|     "compounds": [ | ||||
|         { | ||||
|             "name": "Chill Debug + Yarn Encore Dev (Watch)", | ||||
|             "configurations": ["Chill Debug", "Yarn Encore Dev (Watch)"] | ||||
|         } | ||||
|     ] | ||||
| } | ||||
							
								
								
									
										23
									
								
								.vscode/tasks.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								.vscode/tasks.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
|     "tasks": [ | ||||
|         { | ||||
|             "type": "shell", | ||||
|             "command": "symfony", | ||||
|             "args": [ | ||||
|                 "server:start", | ||||
|                 "--allow-http", | ||||
|                 "--no-tls", | ||||
|                 "--port=8000", | ||||
|                 "--allow-all-ip", | ||||
|                 "-d" | ||||
|             ], | ||||
|             "label": "symfony" | ||||
|         }, | ||||
|         { | ||||
|             "type": "shell", | ||||
|             "command": "yarn", | ||||
|             "args": ["encore", "dev", "--watch"], | ||||
|             "label": "webpack" | ||||
|         } | ||||
|     ] | ||||
| } | ||||
							
								
								
									
										120
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										120
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -6,6 +6,126 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html), | ||||
| and is generated by [Changie](https://github.com/miniscruff/changie). | ||||
|  | ||||
|  | ||||
| ## 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.    | ||||
|   | ||||
| @@ -54,7 +54,7 @@ Arborescence: | ||||
|     - person | ||||
|     - personvendee | ||||
|     - household_edit_metadata | ||||
|         - index.js | ||||
|         - index.ts | ||||
| ``` | ||||
|  | ||||
| ## Organisation des feuilles de styles | ||||
|   | ||||
| @@ -1,7 +1,12 @@ | ||||
| import { trans, setLocale, setLocaleFallbacks } from "./ux-translator"; | ||||
| import { | ||||
|   trans, | ||||
|   setLocale, | ||||
|   getLocale, | ||||
|   setLocaleFallbacks, | ||||
| } from "./ux-translator"; | ||||
|  | ||||
| setLocaleFallbacks({"en": "fr", "nl": "fr", "fr": "en"}); | ||||
| setLocale('fr'); | ||||
| setLocaleFallbacks({ en: "fr", nl: "fr", fr: "en" }); | ||||
| setLocale("fr"); | ||||
|  | ||||
| export { trans }; | ||||
| export * from '../var/translations'; | ||||
| export { trans, getLocale }; | ||||
| export * from "../var/translations"; | ||||
|   | ||||
| @@ -133,6 +133,7 @@ | ||||
|             "Chill\\TaskBundle\\": "src/Bundle/ChillTaskBundle", | ||||
|             "Chill\\ThirdPartyBundle\\": "src/Bundle/ChillThirdPartyBundle", | ||||
|             "Chill\\WopiBundle\\": "src/Bundle/ChillWopiBundle/src", | ||||
|             "Chill\\TicketBundle\\": "src/Bundle/ChillTicketBundle/src", | ||||
|             "Chill\\Utils\\Rector\\": "utils/rector/src" | ||||
|         } | ||||
|     }, | ||||
|   | ||||
| @@ -35,6 +35,7 @@ return [ | ||||
|     Chill\ThirdPartyBundle\ChillThirdPartyBundle::class => ['all' => true], | ||||
|     Chill\BudgetBundle\ChillBudgetBundle::class => ['all' => true], | ||||
|     Chill\WopiBundle\ChillWopiBundle::class => ['all' => true], | ||||
|     Chill\TicketBundle\ChillTicketBundle::class => ['all' => true], | ||||
|     Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], | ||||
|     Symfony\UX\Translator\UxTranslatorBundle::class => ['all' => true], | ||||
| ]; | ||||
|   | ||||
| @@ -17,6 +17,7 @@ chill_main: | ||||
|     acl: | ||||
|         form_show_scopes: true | ||||
|         form_show_centers: true | ||||
|         filter_stats_by_center: true | ||||
|     access_global_history: false | ||||
|     access_user_change_password: true | ||||
|     access_permissions_group_list: true | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| chill_doc_store: | ||||
|     use_driver: openstack | ||||
|     use_driver: local_storage | ||||
|     local_storage: | ||||
|         storage_path: '%kernel.project_dir%/var/storage' | ||||
|     openstack: | ||||
|   | ||||
							
								
								
									
										5
									
								
								config/packages/chill_ticket.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								config/packages/chill_ticket.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| chill_ticket: | ||||
|     ticket: | ||||
|         person_per_ticket:    one # One of "one"; "many" | ||||
|         response_time_exceeded_delay: PT12H | ||||
|  | ||||
| @@ -14,6 +14,7 @@ doctrine_migrations: | ||||
|         'Chill\Migrations\Calendar': '@ChillCalendarBundle/migrations' | ||||
|         'Chill\Migrations\Budget': '@ChillBudgetBundle/migrations' | ||||
|         'Chill\Migrations\Report': '@ChillReportBundle/migrations' | ||||
|         'Chill\Migrations\Ticket': '@ChillTicketBundle/migrations' | ||||
|     all_or_nothing: | ||||
|         true | ||||
|  | ||||
|   | ||||
| @@ -5,7 +5,6 @@ framework: | ||||
|  | ||||
|         # Uncomment this (and the failed transport below) to send failed messages to this transport for later handling. | ||||
|         failure_transport: failed | ||||
|  | ||||
|         transports: | ||||
|             # those transports are added by chill-bundles recipes | ||||
|             sync: sync:// | ||||
| @@ -19,7 +18,9 @@ framework: | ||||
|                         async: ~ | ||||
|                     auto_setup: true | ||||
|  | ||||
|             priority: '%env(MESSENGER_TRANSPORT_DSN)%/priority' | ||||
|             priority: | ||||
|                 dsn: '%env(MESSENGER_TRANSPORT_DSN)%/priority' | ||||
|  | ||||
|             # end of transports added by chill-bundles recipes | ||||
|             # https://symfony.com/doc/current/messenger.html#transport-configuration | ||||
|             failed: 'doctrine://default?queue_name=failed' | ||||
| @@ -61,6 +62,10 @@ 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 | ||||
|   | ||||
							
								
								
									
										2
									
								
								config/routes/chill_ticket.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								config/routes/chill_ticket.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| chill_ticket_bundle: | ||||
|     resource: '@ChillTicketBundle/config/routes.yaml' | ||||
| @@ -12,6 +12,7 @@ declare(strict_types=1); | ||||
| namespace Chill\PersonBundle\Export\Filter; | ||||
|  | ||||
| use Chill\MainBundle\Export\ExportElementValidatedInterface; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use DateTime; | ||||
| use Doctrine\ORM\Query\Expr; | ||||
| @@ -20,6 +21,7 @@ use Symfony\Component\Validator\Context\ExecutionContextInterface; | ||||
|  | ||||
| class BirthdateFilter implements ExportElementValidatedInterface, FilterInterface | ||||
| { | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|     // add specific role for this filter | ||||
|     public function addRole(): ?string | ||||
|     { | ||||
| @@ -28,7 +30,7 @@ class BirthdateFilter implements ExportElementValidatedInterface, FilterInterfac | ||||
|     } | ||||
|  | ||||
|     // here, we alter the query created by Export | ||||
|     public function alterQuery(\Doctrine\ORM\QueryBuilder $qb, $data) | ||||
|     public function alterQuery(\Doctrine\ORM\QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $where = $qb->getDQLPart('where'); | ||||
|         // we create the clause here | ||||
| @@ -52,13 +54,13 @@ class BirthdateFilter implements ExportElementValidatedInterface, FilterInterfac | ||||
|     } | ||||
|  | ||||
|     // we give information on which type of export this filter applies | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return 'person'; | ||||
|     } | ||||
|  | ||||
|     // we build a form to collect some parameters from the users | ||||
|     public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder) | ||||
|     public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('date_from', DateType::class, [ | ||||
|             'label' => 'Born after this date', | ||||
| @@ -74,6 +76,18 @@ class BirthdateFilter implements ExportElementValidatedInterface, FilterInterfac | ||||
|             'format' => 'dd-MM-yyyy', | ||||
|         ]); | ||||
|     } | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['date_from' => $this->normalizeDate($formData['date_from']), 'date_to' => $this->normalizeDate($formData['date_to'])]; | ||||
|     } | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['date_from' => $this->denormalizeDate($formData['date_from']), 'date_to' => $this->denormalizeDate($formData['date_to'])]; | ||||
|     } | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return ['date_from' => new DateTime(), 'date_to' => new DateTime()]; | ||||
| @@ -81,7 +95,7 @@ class BirthdateFilter implements ExportElementValidatedInterface, FilterInterfac | ||||
|  | ||||
|     // here, we create a simple string which will describe the action of | ||||
|     // the filter in the Response | ||||
|     public function describeAction($data, $format = 'string') | ||||
|     public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array | ||||
|     { | ||||
|         return ['Filtered by person\'s birtdate: ' | ||||
|             . 'between %date_from% and %date_to%', [ | ||||
| @@ -90,7 +104,7 @@ class BirthdateFilter implements ExportElementValidatedInterface, FilterInterfac | ||||
|             ], ]; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'Filter by person\'s birthdate'; | ||||
|     } | ||||
| @@ -99,7 +113,7 @@ class BirthdateFilter implements ExportElementValidatedInterface, FilterInterfac | ||||
|     // is executed here. This function is added by the interface | ||||
|     // `ExportElementValidatedInterface`, and can be ignore if there is | ||||
|     // no need for a validation | ||||
|     public function validateForm($data, ExecutionContextInterface $context) | ||||
|     public function validateForm($data, ExecutionContextInterface $context): void | ||||
|     { | ||||
|         $date_from = $data['date_from']; | ||||
|         $date_to = $data['date_to']; | ||||
|   | ||||
| @@ -36,6 +36,18 @@ class CountPerson implements ExportInterface | ||||
|     { | ||||
|         // this export does not add any form | ||||
|     } | ||||
|     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 []; | ||||
| @@ -60,29 +72,29 @@ class CountPerson implements ExportInterface | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         // this array match the result keys in the query. We have only | ||||
|         // one column. | ||||
|         return ['export_result']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'Count peoples'; | ||||
|     } | ||||
|  | ||||
|     public function getType() | ||||
|     public function getType(): string | ||||
|     { | ||||
|         return Declarations::PERSON_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         // we gather all center the user choose. | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|   | ||||
| @@ -11,24 +11,94 @@ | ||||
| Create a new bundle | ||||
| ******************* | ||||
|  | ||||
| Create your own bundle is not a trivial task. | ||||
|  | ||||
| The easiest way to achieve this is seems to be :  | ||||
|  | ||||
| 1. Prepare a fresh installation of the chill project, in a new directory | ||||
| 2. Create a new bundle in this project, in the src directory | ||||
| 3. Initialize a git repository **at the root bundle**, and create your initial commit. | ||||
| 4. Register the bundle with composer/packagist. If you do not plan to distribute your bundle with packagist, you may use a custom repository for achieve this [#f1]_ | ||||
| 5. Move to a development installation, made as described in the :ref:`installation-for-development` section, and add your new repository to the composer.json file | ||||
| 6. Work as :ref:`usual <editing-code-and-commiting>` | ||||
|  | ||||
| .. warning:: | ||||
|  | ||||
|     This part of the doc is not yet tested | ||||
|  | ||||
| TODO | ||||
| Create a new directory with Bundle class | ||||
| ---------------------------------------- | ||||
|  | ||||
| .. code-block:: bash | ||||
|  | ||||
|    mkdir -p src/Bundle/ChillSomeBundle/src/config | ||||
|    mkdir -p src/Bundle/ChillSomeBundle/src/Controller | ||||
|  | ||||
| Add a bundle file | ||||
|  | ||||
| .. code-block:: php | ||||
|  | ||||
|     <?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\SomeBundle; | ||||
|  | ||||
|     use Symfony\Component\HttpKernel\Bundle\Bundle; | ||||
|  | ||||
|     class ChillSomeBundle extends Bundle {} | ||||
|  | ||||
| And a route file: | ||||
|  | ||||
| .. code-block:: yaml | ||||
|  | ||||
|    chill_ticket_controller: | ||||
|        resource: '@ChillTicketBundle/Controller/' | ||||
|        type: annotation | ||||
|  | ||||
| Register the new psr-4 namespace | ||||
| -------------------------------- | ||||
|  | ||||
| In composer.json, add the new psr4 namespace | ||||
|  | ||||
| .. code-block:: diff | ||||
|  | ||||
|     { | ||||
|     "autoload": { | ||||
|         "psr-4": { | ||||
|     +        "Chill\\SomeBundle\\": "src/Bundle/ChillSomeBundle/src", | ||||
|         } | ||||
|     } | ||||
|     } | ||||
|  | ||||
|  | ||||
| .. rubric:: Footnotes | ||||
| Register the bundle | ||||
| ------------------- | ||||
|  | ||||
| Register in the file :code:`config/bundles.php`: | ||||
|  | ||||
| .. code-block:: php | ||||
|  | ||||
|     Vendor\Bundle\YourBundle\YourBundle::class => ['all' => true], | ||||
|  | ||||
| And import routes in :code:`config/routes/chill_some_bundle.yaml`: | ||||
|  | ||||
| .. code-block:: yaml | ||||
|  | ||||
|    chill_ticket_bundle: | ||||
|        resource: '@ChillSomeBundle/config/routes.yaml' | ||||
|  | ||||
| Add the doctrine_migration namespace | ||||
| ------------------------------------ | ||||
|  | ||||
| Add the namespace to :code:`config/packages/doctrine_migrations_chill.yaml` | ||||
|  | ||||
| .. code-block:: diff | ||||
|  | ||||
|    doctrine_migrations: | ||||
|        migrations_paths: | ||||
|    +        'Chill\Some\Ticket': '@ChillSomeBundle/migrations' | ||||
|  | ||||
| Dump autoloading | ||||
| ---------------- | ||||
|  | ||||
| .. code-block:: bash | ||||
|  | ||||
|    symfony composer dump-autoload | ||||
|  | ||||
| .. [#f1] Be aware that we use the Affero GPL Licence, which ensure that all users must have access to derivative works done with this software. | ||||
|   | ||||
							
								
								
									
										84
									
								
								docs/source/development/export-sequence.puml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								docs/source/development/export-sequence.puml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| @startuml | ||||
| 'https://plantuml.com/sequence-diagram | ||||
|  | ||||
| autonumber | ||||
|  | ||||
| User -> ExportController: configure export using form | ||||
| activate ExportController | ||||
| ExportController -> ExportForm: build form | ||||
| activate ExportForm | ||||
|  | ||||
| loop for every ExportElement (Filter, Aggregator) | ||||
|     ExportForm -> ExportElement: `buildForm` | ||||
|     activate ExportElement | ||||
|     ExportElement -> ExportForm: add form to builders | ||||
|     deactivate ExportElement | ||||
| end | ||||
|  | ||||
| ExportForm -> ExportController | ||||
| deactivate ExportForm | ||||
|  | ||||
| ExportController -> User: show form | ||||
| deactivate ExportController | ||||
|  | ||||
| note left of User: Configure the export:\ncheck filters, aggregators, … | ||||
|  | ||||
| User -> ExportController: post configuration of the export | ||||
| activate ExportController | ||||
|  | ||||
| ExportController -> ExportForm: `getData` | ||||
| activate ExportForm | ||||
| ExportForm -> ExportController: return data: list of entities, etc. | ||||
| deactivate ExportForm | ||||
|  | ||||
| loop for every ExportElement (Filter, Aggregator) | ||||
|     ExportController -> ExportElement: serializeData (data) | ||||
|     activate ExportElement | ||||
|     ExportElement -> ExportController: return serializedData (simple array with string, int, …) | ||||
|     deactivate ExportElement | ||||
| end | ||||
|  | ||||
| ExportController -> Database: `INSERT INTO RequestGeneration_table` (insert new entity) | ||||
| ExportController -> MessageQueue: warn about a new request | ||||
| activate MessageQueue | ||||
| ExportController -> User: "ok, generation is in process" | ||||
| deactivate ExportController | ||||
|  | ||||
| note left of User: The user see a waiting screen | ||||
|  | ||||
| MessageQueue -> MessengerConsumer: forward the message to the MessengerConsumer | ||||
| deactivate MessageQueue | ||||
| activate MessengerConsumer | ||||
| MessengerConsumer -> Database: `SELECT * FROM RequestGeneration_table WHERE id = %s` | ||||
| activate Database | ||||
| Database -> MessengerConsumer: return RequestGeneration with serializedData | ||||
| deactivate Database | ||||
|  | ||||
| loop for every ExportElement (Filter, Aggregator) | ||||
|     MessengerConsumer -> ExportElement: deserializeData | ||||
|     activate ExportElement | ||||
|     ExportElement -> MessengerConsumer: return data (list of entities, etc.) from the serialized array | ||||
|     deactivate ExportElement | ||||
|     MessengerConsumer -> ExportElement: alter the sql query (`ExportElement::alterQuery`) | ||||
|     activate ExportElement | ||||
|     ExportElement -> MessengerConsumer: return the query with WHERE and GROUP BY clauses | ||||
|     deactivate ExportElement | ||||
| end | ||||
|  | ||||
| MessengerConsumer -> MessengerConsumer: prepare the export | ||||
| MessengerConsumer -> MessengerConsumer: save the export as a stored object | ||||
| MessengerConsumer -> Database: `UPDATE RequestGeneration_table SET ready = true` | ||||
| deactivate MessengerConsumer | ||||
|  | ||||
| User -> ExportController: pull every 5s to know if the export is generated | ||||
| activate ExportController | ||||
| ExportController -> User: warn the export is generated | ||||
| deactivate ExportController | ||||
|  | ||||
| User -> ExportController: download the export from object storage | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| @enduml | ||||
| @@ -15,24 +15,31 @@ Messages to users, flashbags and buttons | ||||
| Flashbags | ||||
| ========== | ||||
|  | ||||
| The four following levels are defined :  | ||||
| The four following levels are defined : | ||||
|  | ||||
| +-----------+----------------------------------------------------------------------------------------------+ | ||||
| |Key        |Intent                                                                                        | | ||||
| +===========+==============================================================================================+ | ||||
| |alert      |A message not linked with the user action, but which should require an action or a            | | ||||
| |           |correction.                                                                                   | | ||||
| +-----------+----------------------------------------------------------------------------------------------+ | ||||
| |success    |The user action succeeds.                                                                     | | ||||
| +-----------+----------------------------------------------------------------------------------------------+ | ||||
| |notice     |A simple message to give information to the user. The message may be linked or not linked with| | ||||
| |           |the user action.                                                                              | | ||||
| +-----------+----------------------------------------------------------------------------------------------+ | ||||
| |warning    |A message linked with an action, the user should correct.                                     | | ||||
| +-----------+----------------------------------------------------------------------------------------------+ | ||||
| |error      |The user's action failed: he must correct something to process the action.                    | | ||||
| +-----------+----------------------------------------------------------------------------------------------+ | ||||
|  | ||||
| We can use :code:`TranslatableMessage` (and other :code:`TranslatableMessageInterface` instances) into the controller: | ||||
|  | ||||
| .. code-block:: php | ||||
|  | ||||
|    // in a controller action: | ||||
|    if (($session = $request->getSession()) instanceof Session) { | ||||
|        $session->getFlashBag()->add( | ||||
|            'success', | ||||
|            new TranslatableMessage('saved_export.Saved export is saved!') | ||||
|        ); | ||||
|    } | ||||
|  | ||||
| .. seealso:: | ||||
|  | ||||
|    `Flash Messages on Symfony documentation <http://symfony.com/doc/current/book/controller.html#flash-messages>`_ | ||||
| @@ -66,7 +73,7 @@ To add the action on button, use them as class along with ``sc-button`` : | ||||
| |           |                | - Submitting this form will remove the entity                                | | ||||
| +-----------+----------------+------------------------------------------------------------------------------+ | ||||
| | Edit      | ``bt-edit`` or | Link to a form to edit an entity                                             | | ||||
| |           | ``bt-update``  |                                                                              |  | ||||
| |           | ``bt-update``  |                                                                              | | ||||
| +-----------+----------------+------------------------------------------------------------------------------+ | ||||
| | Save      | ``bt-save``    | Submitting this form will save change on the entity                          | | ||||
| +-----------+----------------+------------------------------------------------------------------------------+ | ||||
|   | ||||
| @@ -79,12 +79,12 @@ | ||||
|     "dev": "encore dev", | ||||
|     "watch": "encore dev --watch", | ||||
|     "build": "encore production --progress", | ||||
|     "specs-build": "yaml-merge src/Bundle/ChillMainBundle/chill.api.specs.yaml src/Bundle/ChillPersonBundle/chill.api.specs.yaml src/Bundle/ChillCalendarBundle/chill.api.specs.yaml src/Bundle/ChillThirdPartyBundle/chill.api.specs.yaml src/Bundle/ChillDocStoreBundle/chill.api.specs.yaml> templates/api/specs.yaml", | ||||
|     "specs-build": "yaml-merge src/Bundle/ChillMainBundle/chill.api.specs.yaml src/Bundle/ChillPersonBundle/chill.api.specs.yaml src/Bundle/ChillCalendarBundle/chill.api.specs.yaml src/Bundle/ChillThirdPartyBundle/chill.api.specs.yaml src/Bundle/ChillDocStoreBundle/chill.api.specs.yaml src/Bundle/ChillTicketBundle/chill.api.specs.yaml> templates/api/specs.yaml", | ||||
|     "specs-validate": "swagger-cli validate templates/api/specs.yaml", | ||||
|     "specs-create-dir": "mkdir -p templates/api", | ||||
|     "specs": "yarn run specs-create-dir && yarn run specs-build && yarn run specs-validate", | ||||
|     "version": "node --version", | ||||
|     "eslint": "npx eslint-baseline --fix \"src/**/*.{js,ts,vue}\"" | ||||
|     "eslint": "eslint-baseline --fix \"src/**/*.{js,ts,vue}\"" | ||||
|   }, | ||||
|   "private": true | ||||
| } | ||||
|   | ||||
| @@ -2154,11 +2154,6 @@ 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 | ||||
|   | ||||
| @@ -3,7 +3,7 @@ parameters: | ||||
|     paths: | ||||
|         - src/ | ||||
|         - utils/ | ||||
|     tmpDir: .cache/ | ||||
|     tmpDir: var/cache/phpstan | ||||
|     reportUnmatchedIgnoredErrors: false | ||||
|     excludePaths: | ||||
|         - .php_cs* | ||||
|   | ||||
| @@ -1,13 +1,24 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd" bootstrap="vendor/autoload.php" executionOrder="depends,defects" beStrictAboutOutputDuringTests="true" failOnRisky="true" failOnWarning="true" colors="true" cacheDirectory="var/cache/phpunit.rector.cache" requireCoverageMetadata="true" beStrictAboutCoverageMetadata="true"> | ||||
|   <testsuites> | ||||
|     <testsuite name="default"> | ||||
|       <directory>utils/rector/tests</directory> | ||||
|     </testsuite> | ||||
|   </testsuites> | ||||
|   <source> | ||||
|     <include> | ||||
|       <directory suffix=".php">utils/rector/src</directory> | ||||
|     </include> | ||||
|   </source> | ||||
| <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|          xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd" | ||||
|          bootstrap="vendor/autoload.php" | ||||
|          executionOrder="depends,defects" | ||||
|          beStrictAboutOutputDuringTests="true" | ||||
|          failOnRisky="true" | ||||
|          failOnWarning="true" | ||||
|          colors="true" | ||||
|          cacheDirectory="var/cache/phpunit.rector.cache" | ||||
|          requireCoverageMetadata="true" | ||||
|          beStrictAboutCoverageMetadata="true" | ||||
|          displayDetailsOnTestsThatTriggerWarnings="true"> | ||||
|     <testsuites> | ||||
|         <testsuite name="default"> | ||||
|             <directory>utils/rector/tests</directory> | ||||
|         </testsuite> | ||||
|     </testsuites> | ||||
|     <source> | ||||
|         <include> | ||||
|             <directory suffix=".php">utils/rector/src</directory> | ||||
|         </include> | ||||
|     </source> | ||||
| </phpunit> | ||||
|   | ||||
| @@ -58,6 +58,10 @@ | ||||
|       <!-- temporarily removed, the time to find a fix --> | ||||
|       <exclude>src/Bundle/ChillPersonBundle/Tests/Controller/PersonDuplicateControllerViewTest.php</exclude> | ||||
|     </testsuite> | ||||
|  | ||||
|     <testsuite name="TicketBundle"> | ||||
|       <directory suffix="Test.php">src/Bundle/ChillTicketBundle/tests/</directory> | ||||
|     </testsuite> | ||||
|     <!-- | ||||
|         <testsuite name="ReportBundle"> | ||||
|             <directory suffix="Test.php">src/Bundle/ChillReportBundle/Tests/</directory> | ||||
|   | ||||
							
								
								
									
										19
									
								
								rector.php
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								rector.php
									
									
									
									
									
								
							| @@ -18,14 +18,15 @@ return static function (RectorConfig $rectorConfig): void { | ||||
|     $rectorConfig->paths([ | ||||
|         __DIR__ . '/docs', | ||||
|         __DIR__ . '/src', | ||||
|         __DIR__ . '/rector.php', | ||||
|     ]); | ||||
|  | ||||
|     $rectorConfig->skip([ | ||||
|         \Rector\Php55\Rector\String_\StringClassNameToClassConstantRector::class => __DIR__ . 'src/Bundle/ChillMainBundle/Service/Notifier/LegacyOvhCloudFactory.php' | ||||
|     ]); | ||||
|  | ||||
|     $rectorConfig->symfonyContainerXml(__DIR__ . '/var/cache/dev/test/App_KernelTestDebugContainer.xml  '); | ||||
|     $rectorConfig->symfonyContainerPhp(__DIR__ . '/tests/symfony-container.php'); | ||||
|     //$rectorConfig->symfonyContainerXml(__DIR__ . '/var/cache/dev/test/App_KernelTestDebugContainer.xml  '); | ||||
|     //$rectorConfig->symfonyContainerPhp(__DIR__ . '/tests/symfony-container.php'); | ||||
|  | ||||
|     //$rectorConfig->cacheClass(\Rector\Caching\ValueObject\Storage\FileCacheStorage::class); | ||||
|     //$rectorConfig->cacheDirectory(__DIR__ . '/.cache/rector'); | ||||
| @@ -39,16 +40,11 @@ return static function (RectorConfig $rectorConfig): void { | ||||
|     // part of the symfony 54 rules | ||||
|     $rectorConfig->rule(\Rector\Symfony\Symfony53\Rector\StaticPropertyFetch\KernelTestCaseContainerPropertyDeprecationRector::class); | ||||
|     $rectorConfig->rule(\Rector\Symfony\Symfony60\Rector\MethodCall\GetHelperControllerToServiceRector::class); | ||||
|     $rectorConfig->disableParallel(); | ||||
|     //$rectorConfig->disableParallel(); | ||||
|  | ||||
|     //define sets of rules | ||||
|     $rectorConfig->sets([ | ||||
|         LevelSetList::UP_TO_PHP_82, | ||||
|         \Rector\Symfony\Set\SymfonySetList::SYMFONY_40, | ||||
|         \Rector\Symfony\Set\SymfonySetList::SYMFONY_41, | ||||
|         \Rector\Symfony\Set\SymfonySetList::SYMFONY_42, | ||||
|         \Rector\Symfony\Set\SymfonySetList::SYMFONY_43, | ||||
|         \Rector\Symfony\Set\SymfonySetList::SYMFONY_44, | ||||
|         \Rector\Doctrine\Set\DoctrineSetList::DOCTRINE_CODE_QUALITY, | ||||
|         \Rector\PHPUnit\Set\PHPUnitSetList::PHPUNIT_90, | ||||
|     ]); | ||||
| @@ -66,11 +62,6 @@ return static function (RectorConfig $rectorConfig): void { | ||||
|     // some routes are added twice if it remains activated | ||||
|     // $rectorConfig->rule(\Rector\Symfony\Configs\Rector\ClassMethod\AddRouteAnnotationRector::class); | ||||
|  | ||||
|     // chill rules | ||||
|     $rectorConfig->rules([ | ||||
|         \Chill\Utils\Rector\Rector\ChillBundleMakeDataProviderStaticForAbstractExportTestRector::class, | ||||
|     ]); | ||||
|  | ||||
|     // skip some path... | ||||
|     $rectorConfig->skip([ | ||||
|         // waiting for fixing this bug: https://github.com/rectorphp/rector-doctrine/issues/342 | ||||
| @@ -94,4 +85,6 @@ return static function (RectorConfig $rectorConfig): void { | ||||
|         new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\MainBundle\Validator\Constraints\Entity\UserCircleConsistency'), | ||||
|         new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\MainBundle\Workflow\Validator\EntityWorkflowCreation'), | ||||
|     ]); | ||||
|  | ||||
|  | ||||
| }; | ||||
|   | ||||
							
								
								
									
										8
									
								
								resources/ticket_motives_import/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								resources/ticket_motives_import/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| In this directory, you find an example of file for the command `chill:main:ticket_motives_import`. | ||||
|  | ||||
| This file contains a list of ticket motives to import into the system. Each entry is a dictionary with two keys: `code` and `label`. The `code` key contains the unique code for the ticket motive, and the `label` key contains the human-readable label for the ticket motive. | ||||
|  | ||||
| The `stored_objects` key contains the documents that will be associated with the tickets. They must be found in the same directory. | ||||
|  | ||||
| The command `chill:main:ticket_motives_import` uses this file to import the specified ticket motives into the system. | ||||
|  | ||||
							
								
								
									
										136
									
								
								resources/ticket_motives_import/motives.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								resources/ticket_motives_import/motives.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,136 @@ | ||||
| - label: | ||||
|     fr: Appel famille pour annonce de décès | ||||
|   urgent: false | ||||
|   supplementary_informations: | ||||
|   - label: | ||||
|       fr: Date du décès | ||||
|   - label: | ||||
|       fr: lieu du décès (domicile ou hôpital) | ||||
|   - label: | ||||
|       fr: nom de l’hôpital | ||||
|   - label: | ||||
|       fr: service concerné | ||||
|   stored_objects: | ||||
|   - label: | ||||
|       fr: ☀️ De 07h à 21h | ||||
|     filename: 2_doc_20250402_Pelotons flux externes consolidés.pdf | ||||
|   - label: | ||||
|       fr: 🌙 De 21h à 07h du matin | ||||
|     filename: 3_doc_20250402_Pelotons flux externes consolidés.pdf | ||||
|   - label: | ||||
|       fr: 🗓️ Dimanches et jours fériés | ||||
|     filename: 4_doc_20250402_Pelotons flux externes consolidés.pdf | ||||
| - label: | ||||
|     fr: 'Appel famille pour annonce absence : hospitalisation ou consultation' | ||||
|   urgent: false | ||||
|   supplementary_informations: | ||||
|   - label: | ||||
|       fr: Quel hôpital | ||||
|   - label: | ||||
|       fr: quel service | ||||
|   - label: | ||||
|       fr: pour quelles raisons | ||||
|   - label: | ||||
|       fr: 'consultation : date et heure' | ||||
|   - label: | ||||
|       fr: hospitalisation complète ou HDJ | ||||
|   stored_objects: | ||||
|   - label: | ||||
|       fr: ☀️ De 07h à 21h | ||||
|     filename: 5_doc_20250402_Pelotons flux externes consolidés.pdf | ||||
|   - label: | ||||
|       fr: 🌙 De 21h à 07h du matin | ||||
|     filename: 6_doc_20250402_Pelotons flux externes consolidés.pdf | ||||
|   - label: | ||||
|       fr: 🗓️ Dimanches et jours fériés | ||||
|     filename: 7_doc_20250402_Pelotons flux externes consolidés.pdf | ||||
| - label: | ||||
|     fr: 'Appel famille pour annonce absence : interruption de prise en charge' | ||||
|   urgent: false | ||||
|   supplementary_informations: | ||||
|   - label: | ||||
|       fr: Pour quelles raisons ? Date | ||||
|   - label: | ||||
|       fr: durée | ||||
|   - label: | ||||
|       fr: accord médical ? | ||||
|   stored_objects: | ||||
|   - label: | ||||
|       fr: ☀️ De 07h à 21h | ||||
|     filename: 8_doc_20250402_Pelotons flux externes consolidés.pdf | ||||
|   - label: | ||||
|       fr: 🌙 De 21h à 07h du matin | ||||
|     filename: 9_doc_20250402_Pelotons flux externes consolidés.pdf | ||||
|   - label: | ||||
|       fr: 🗓️ Dimanches et jours fériés | ||||
|     filename: 10_doc_20250402_Pelotons flux externes consolidés.pdf | ||||
| - label: | ||||
|     fr: 'Appel famille pour annonce absence : changement d’adresse' | ||||
|   urgent: false | ||||
|   supplementary_informations: | ||||
|   - label: | ||||
|       fr: Où | ||||
|   - label: | ||||
|       fr: Pourquoi ? Pour combien de temps ? Besoin d’un relais des soins ? Nouvelle adresse ? | ||||
|   stored_objects: | ||||
|   - label: | ||||
|       fr: ☀️ De 07h à 21h | ||||
|     filename: 11_doc_20250402_Pelotons flux externes consolidés.pdf | ||||
|   - label: | ||||
|       fr: 🌙 De 21h à 07h du matin | ||||
|     filename: 12_doc_20250402_Pelotons flux externes consolidés.pdf | ||||
|   - label: | ||||
|       fr: 🗓️ Dimanches et jours fériés | ||||
|     filename: 13_doc_20250402_Pelotons flux externes consolidés.pdf | ||||
| - label: | ||||
|     fr: Appel famille pour altération de l’état général du patient | ||||
|   urgent: true | ||||
|   supplementary_informations: | ||||
|   - label: | ||||
|       fr: Recherche des symptômes | ||||
|   - label: | ||||
|       fr: Attentes par rapport à la demande | ||||
|   stored_objects: | ||||
|   - label: | ||||
|       fr: ☀️ De 07h à 21h | ||||
|     filename: 14_doc_20250402_Pelotons flux externes consolidés.pdf | ||||
|   - label: | ||||
|       fr: 🌙 De 21h à 07h du matin | ||||
|     filename: 15_doc_20250402_Pelotons flux externes consolidés.pdf | ||||
|   - label: | ||||
|       fr: 🗓️ Dimanches et jours fériés | ||||
|     filename: 16_doc_20250402_Pelotons flux externes consolidés.pdf | ||||
| - label: | ||||
|     fr: Appel famille pour prise en charge de la douleur | ||||
|   urgent: true | ||||
|   supplementary_informations: | ||||
|   - label: | ||||
|       fr: Localisation douleur | ||||
|   - label: | ||||
|       fr: Horaire dernier passage | ||||
|   - label: | ||||
|       fr: Traitements en cours | ||||
|   stored_objects: | ||||
|   - label: | ||||
|       fr: ☀️ De 07h à 21h | ||||
|     filename: 17_doc_20250402_Pelotons flux externes consolidés.pdf | ||||
|   - label: | ||||
|       fr: 🌙 De 21h à 07h du matin | ||||
|     filename: 18_doc_20250402_Pelotons flux externes consolidés.pdf | ||||
|   - label: | ||||
|       fr: 🗓️ Dimanches et jours fériés | ||||
|     filename: 19_doc_20250402_Pelotons flux externes consolidés.pdf | ||||
| - label: | ||||
|     fr: Appel famille pour information sur la date de prise en charge | ||||
|   urgent: false | ||||
|   supplementary_informations: [] | ||||
|   stored_objects: | ||||
|   - label: | ||||
|       fr: ☀️ De 07h à 21h | ||||
|     filename: 20_doc_20250402_Pelotons flux externes consolidés.pdf | ||||
|   - label: | ||||
|       fr: 🌙 De 21h à 07h du matin | ||||
|     filename: 21_doc_20250402_Pelotons flux externes consolidés.pdf | ||||
|   - label: | ||||
|       fr: 🗓️ Dimanches et jours fériés | ||||
|     filename: 22_doc_20250402_Pelotons flux externes consolidés.pdf | ||||
							
								
								
									
										6
									
								
								resources/translation_override/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								resources/translation_override/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| In this directory, you find an example of file for the command `chill:main:override_translation`. | ||||
|  | ||||
| This file contains a list of translations to override in the translation catalogue. Each entry is a dictionary with two keys: `from` and `to`. The `from` key contains the original translation string, and the `to` key contains the replacement string. | ||||
|  | ||||
| The command `chill:main:override_translation` uses this file to generate a new translation catalogue with the specified overrides applied. | ||||
|  | ||||
							
								
								
									
										8
									
								
								resources/translation_override/overrides.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								resources/translation_override/overrides.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| - {from: "de l'usager", to: "du patient"} | ||||
| - {from: "l'usager", to: "le patient"} | ||||
| - {from: "L'usager", to: "Le patient"} | ||||
| - {from: "d'usagers", to: "de patients"} | ||||
| - {from: "usagers", to: "patients"} | ||||
| - {from: "Usagers", to: "Patients"} | ||||
| - {from: "usager", to: "patient"} | ||||
| - {from: "Usager", to: "Patient"} | ||||
| @@ -17,7 +17,6 @@ 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. | ||||
|   | ||||
| @@ -24,7 +24,7 @@ class ByActivityNumberAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data): void | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb | ||||
|             ->addSelect('(SELECT COUNT(activity.id) FROM '.Activity::class.' activity WHERE activity.accompanyingPeriod = acp) AS activity_by_number_aggregator') | ||||
| @@ -41,12 +41,27 @@ class ByActivityNumberAggregator implements AggregatorInterface | ||||
|         // 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) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return static function ($value) { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -33,7 +33,7 @@ final readonly class ByActivityTypeAggregator implements AggregatorInterface | ||||
|         private TranslatableStringHelperInterface $translatableStringHelper, | ||||
|     ) {} | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder | ||||
|             ->add('after_date', PickRollingDateType::class, [ | ||||
| @@ -46,6 +46,21 @@ final readonly class ByActivityTypeAggregator implements AggregatorInterface | ||||
|             ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['after_date' => $formData['after_date']->normalize(), 'before_date' => $formData['before_date']->normalize()]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['after_date' => \Chill\MainBundle\Service\RollingDate\RollingDate::fromNormalized($formData['after_date']), 'before_date' => \Chill\MainBundle\Service\RollingDate\RollingDate::fromNormalized($formData['before_date'])]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return [ | ||||
| @@ -54,7 +69,7 @@ final readonly class ByActivityTypeAggregator implements AggregatorInterface | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, mixed $data) | ||||
|     public function getLabels($key, array $values, mixed $data): callable | ||||
|     { | ||||
|         return function (int|string|null $value): string { | ||||
|             if ('_header' === $value) { | ||||
| @@ -69,12 +84,12 @@ final readonly class ByActivityTypeAggregator implements AggregatorInterface | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return [self::PREFIX.'_actype_id']; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'export.aggregator.acp.by_activity_type.title'; | ||||
|     } | ||||
| @@ -84,7 +99,7 @@ final readonly class ByActivityTypeAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -115,7 +130,7 @@ final readonly class ByActivityTypeAggregator implements AggregatorInterface | ||||
|             ->addGroupBy("{$p}_actype_id"); | ||||
|     } | ||||
|  | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return Declarations::ACP_TYPE; | ||||
|     } | ||||
|   | ||||
| @@ -27,7 +27,7 @@ class BySocialActionAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('actsocialaction', $qb->getAllAliases(), true)) { | ||||
|             $qb->leftJoin('activity.socialActions', 'actsocialaction'); | ||||
| @@ -42,17 +42,32 @@ class BySocialActionAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY_ACP; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // no form | ||||
|     } | ||||
|  | ||||
|     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) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value) { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -27,7 +27,7 @@ class BySocialIssueAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('actsocialissue', $qb->getAllAliases(), true)) { | ||||
|             $qb->leftJoin('activity.socialIssues', 'actsocialissue'); | ||||
| @@ -42,17 +42,32 @@ class BySocialIssueAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY_ACP; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // no form | ||||
|     } | ||||
|  | ||||
|     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) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -25,7 +25,7 @@ final readonly class ActivityLocationAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('actloc', $qb->getAllAliases(), true)) { | ||||
|             $qb->leftJoin('activity.location', 'actloc'); | ||||
| @@ -39,17 +39,32 @@ final readonly class ActivityLocationAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // no form required for this aggregator | ||||
|     } | ||||
|  | ||||
|     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): \Closure | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
| @@ -69,7 +84,7 @@ final readonly class ActivityLocationAggregator implements AggregatorInterface | ||||
|         return [self::KEY]; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'export.aggregator.activity.by_location.Title'; | ||||
|     } | ||||
|   | ||||
| @@ -22,14 +22,29 @@ final readonly class ActivityPresenceAggregator implements AggregatorInterface | ||||
| { | ||||
|     public function __construct(private ActivityPresenceRepositoryInterface $activityPresenceRepository, private TranslatableStringHelperInterface $translatableStringHelper) {} | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|     public function buildForm(FormBuilderInterface $builder): void {} | ||||
|  | ||||
|     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, mixed $data) | ||||
|     public function getLabels($key, array $values, mixed $data): callable | ||||
|     { | ||||
|         return function (int|string|null $value): string { | ||||
|             if ('_header' === $value) { | ||||
| @@ -44,7 +59,7 @@ final readonly class ActivityPresenceAggregator implements AggregatorInterface | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return ['activity_presence_aggregator_attendee']; | ||||
|     } | ||||
| @@ -59,13 +74,13 @@ final readonly class ActivityPresenceAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data): void | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb->addSelect('IDENTITY(activity.attendee) AS activity_presence_aggregator_attendee'); | ||||
|         $qb->addGroupBy('activity_presence_aggregator_attendee'); | ||||
|     } | ||||
|  | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|   | ||||
| @@ -36,7 +36,7 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         // add select element | ||||
|         if ('reasons' === $data['level']) { | ||||
| @@ -72,7 +72,7 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add( | ||||
|             'level', | ||||
| @@ -89,6 +89,21 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['level' => $formData['level']]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['level' => $formData['level']]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return [ | ||||
| @@ -96,7 +111,7 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value) use ($data) { | ||||
|             if ('_header' === $value) { | ||||
| @@ -125,7 +140,7 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         // add select element | ||||
|         if ('reasons' === $data['level']) { | ||||
| @@ -139,12 +154,12 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali | ||||
|         throw new \RuntimeException('The data provided are not recognised.'); | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'Aggregate by activity reason'; | ||||
|     } | ||||
|  | ||||
|     public function validateForm($data, ExecutionContextInterface $context) | ||||
|     public function validateForm($data, ExecutionContextInterface $context): void | ||||
|     { | ||||
|         if (null === $data['level']) { | ||||
|             $context | ||||
|   | ||||
| @@ -29,7 +29,7 @@ class ActivityTypeAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('acttype', $qb->getAllAliases(), true)) { | ||||
|             $qb->leftJoin('activity.activityType', 'acttype'); | ||||
| @@ -44,17 +44,32 @@ class ActivityTypeAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // no form required for this aggregator | ||||
|     } | ||||
|  | ||||
|     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): \Closure | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function (int|string|null $value): string { | ||||
|             if ('_header' === $value) { | ||||
| @@ -74,7 +89,7 @@ class ActivityTypeAggregator implements AggregatorInterface | ||||
|         return [self::KEY]; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'Aggregate by activity type'; | ||||
|     } | ||||
|   | ||||
| @@ -29,7 +29,7 @@ class ActivityUserAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         // add select element | ||||
|         $qb->addSelect(sprintf('IDENTITY(activity.user) AS %s', self::KEY)); | ||||
| @@ -43,17 +43,32 @@ class ActivityUserAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // nothing to add | ||||
|     } | ||||
|  | ||||
|     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, $values, $data): \Closure | ||||
|     public function getLabels($key, $values, $data): callable | ||||
|     { | ||||
|         return function ($value) { | ||||
|             if ('_header' === $value) { | ||||
| @@ -70,7 +85,7 @@ class ActivityUserAggregator implements AggregatorInterface | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return [self::KEY]; | ||||
|     } | ||||
|   | ||||
| @@ -27,7 +27,7 @@ class ActivityUsersAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('actusers', $qb->getAllAliases(), true)) { | ||||
|             $qb->leftJoin('activity.users', 'actusers'); | ||||
| @@ -43,17 +43,32 @@ class ActivityUsersAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // nothing to add on the form | ||||
|     } | ||||
|  | ||||
|     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) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value) { | ||||
|             if ('_header' === $value) { | ||||
| @@ -70,12 +85,12 @@ class ActivityUsersAggregator implements AggregatorInterface | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return ['activity_users_aggregator']; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'Aggregate by activity users'; | ||||
|     } | ||||
|   | ||||
| @@ -34,7 +34,7 @@ class ActivityUsersJobAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -65,14 +65,29 @@ class ActivityUsersJobAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|     public function buildForm(FormBuilderInterface $builder): void {} | ||||
|  | ||||
|     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) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -34,7 +34,7 @@ class ActivityUsersScopeAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -65,14 +65,29 @@ class ActivityUsersScopeAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|     public function buildForm(FormBuilderInterface $builder): void {} | ||||
|  | ||||
|     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) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -27,7 +27,7 @@ class ByCreatorAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb->addSelect('IDENTITY(activity.createdBy) AS creator_aggregator'); | ||||
|         $qb->addGroupBy('creator_aggregator'); | ||||
| @@ -38,17 +38,32 @@ class ByCreatorAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // no form | ||||
|     } | ||||
|  | ||||
|     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) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -27,7 +27,7 @@ class ByThirdpartyAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('acttparty', $qb->getAllAliases(), true)) { | ||||
|             $qb->leftJoin('activity.thirdParties', 'acttparty'); | ||||
| @@ -42,17 +42,32 @@ class ByThirdpartyAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // no form | ||||
|     } | ||||
|  | ||||
|     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) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -34,7 +34,7 @@ class CreatorJobAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -65,14 +65,29 @@ class CreatorJobAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|     public function buildForm(FormBuilderInterface $builder): void {} | ||||
|  | ||||
|     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) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -34,7 +34,7 @@ class CreatorScopeAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -65,14 +65,29 @@ class CreatorScopeAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|     public function buildForm(FormBuilderInterface $builder): void {} | ||||
|  | ||||
|     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) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -32,7 +32,7 @@ class DateAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $order = null; | ||||
|  | ||||
| @@ -67,7 +67,7 @@ class DateAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('frequency', ChoiceType::class, [ | ||||
|             'choices' => self::CHOICES, | ||||
| @@ -76,12 +76,27 @@ class DateAggregator implements AggregatorInterface | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['frequency' => $formData['frequency']]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['frequency' => $formData['frequency']]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return ['frequency' => self::DEFAULT_CHOICE]; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return static function ($value) use ($data): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -27,7 +27,7 @@ class LocationTypeAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('actloc', $qb->getAllAliases(), true)) { | ||||
|             $qb->leftJoin('activity.location', 'actloc'); | ||||
| @@ -42,17 +42,32 @@ class LocationTypeAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // no form | ||||
|     } | ||||
|  | ||||
|     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) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -24,17 +24,32 @@ final readonly class HouseholdAggregator implements AggregatorInterface | ||||
| { | ||||
|     public function __construct(private HouseholdRepository $householdRepository) {} | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // nothing to add here | ||||
|     } | ||||
|  | ||||
|     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, mixed $data) | ||||
|     public function getLabels($key, array $values, mixed $data): callable | ||||
|     { | ||||
|         return function (int|string|null $value): string|int { | ||||
|             if ('_header' === $value) { | ||||
| @@ -49,12 +64,12 @@ final readonly class HouseholdAggregator implements AggregatorInterface | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return ['activity_household_agg']; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'export.aggregator.person.by_household.title'; | ||||
|     } | ||||
| @@ -64,7 +79,7 @@ final readonly class HouseholdAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb->join( | ||||
|             HouseholdMember::class, | ||||
| @@ -92,7 +107,7 @@ final readonly class HouseholdAggregator implements AggregatorInterface | ||||
|             ->addGroupBy('activity_household_agg'); | ||||
|     } | ||||
|  | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return Declarations::ACTIVITY_PERSON; | ||||
|     } | ||||
|   | ||||
| @@ -21,27 +21,42 @@ final readonly class PersonAggregator implements AggregatorInterface | ||||
| { | ||||
|     public function __construct(private LabelPersonHelper $labelPersonHelper) {} | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // nothing to add here | ||||
|     } | ||||
|  | ||||
|     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, mixed $data) | ||||
|     public function getLabels($key, array $values, mixed $data): callable | ||||
|     { | ||||
|         return $this->labelPersonHelper->getLabel($key, $values, 'export.aggregator.person.by_person.person'); | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return ['activity_by_person_agg']; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'export.aggregator.person.by_person.title'; | ||||
|     } | ||||
| @@ -51,14 +66,14 @@ final readonly class PersonAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb | ||||
|             ->addSelect('IDENTITY(activity.person) AS activity_by_person_agg') | ||||
|             ->addGroupBy('activity_by_person_agg'); | ||||
|     } | ||||
|  | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return Declarations::ACTIVITY_PERSON; | ||||
|     } | ||||
|   | ||||
| @@ -27,17 +27,32 @@ final readonly class PersonsAggregator implements AggregatorInterface | ||||
|  | ||||
|     public function __construct(private LabelPersonHelper $labelPersonHelper) {} | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // nothing to add here | ||||
|     } | ||||
|  | ||||
|     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, mixed $data) | ||||
|     public function getLabels($key, array $values, mixed $data): callable | ||||
|     { | ||||
|         if ($key !== self::PREFIX.'_pid') { | ||||
|             throw new \UnexpectedValueException('this key should not be handled: '.$key); | ||||
| @@ -46,12 +61,12 @@ final readonly class PersonsAggregator implements AggregatorInterface | ||||
|         return $this->labelPersonHelper->getLabel($key, $values, 'export.aggregator.activity.by_persons.Persons'); | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return [self::PREFIX.'_pid']; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'export.aggregator.activity.by_persons.Group activity by persons'; | ||||
|     } | ||||
| @@ -61,7 +76,7 @@ final readonly class PersonsAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -71,7 +86,7 @@ final readonly class PersonsAggregator implements AggregatorInterface | ||||
|             ->addGroupBy("{$p}_pid"); | ||||
|     } | ||||
|  | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|   | ||||
| @@ -26,7 +26,7 @@ class SentReceivedAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data): void | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb->addSelect('activity.sentReceived AS activity_sentreceived_aggregator') | ||||
|             ->addGroupBy('activity_sentreceived_aggregator'); | ||||
| @@ -42,6 +42,21 @@ class SentReceivedAggregator implements AggregatorInterface | ||||
|         // 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 []; | ||||
|   | ||||
| @@ -15,6 +15,7 @@ use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\ActivityBundle\Repository\ActivityRepository; | ||||
| use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter; | ||||
| use Chill\MainBundle\Export\AccompanyingCourseExportHelper; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\ExportInterface; | ||||
| use Chill\MainBundle\Export\FormatterInterface; | ||||
| use Chill\MainBundle\Export\GroupedExportInterface; | ||||
| @@ -38,6 +39,21 @@ class AvgActivityDuration implements ExportInterface, GroupedExportInterface | ||||
|  | ||||
|     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 []; | ||||
| @@ -72,7 +88,7 @@ class AvgActivityDuration implements ExportInterface, GroupedExportInterface | ||||
|         return ['export_avg_activity_duration']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
| @@ -87,7 +103,7 @@ class AvgActivityDuration implements ExportInterface, GroupedExportInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|   | ||||
| @@ -15,6 +15,7 @@ use Chill\ActivityBundle\Entity\Activity; | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter; | ||||
| use Chill\MainBundle\Export\AccompanyingCourseExportHelper; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\ExportInterface; | ||||
| use Chill\MainBundle\Export\FormatterInterface; | ||||
| use Chill\MainBundle\Export\GroupedExportInterface; | ||||
| @@ -46,6 +47,21 @@ class AvgActivityVisitDuration implements ExportInterface, GroupedExportInterfac | ||||
|         // TODO: Implement buildForm() method. | ||||
|     } | ||||
|  | ||||
|     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 []; | ||||
| @@ -80,7 +96,7 @@ class AvgActivityVisitDuration implements ExportInterface, GroupedExportInterfac | ||||
|         return ['export_avg_activity_visit_duration']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
| @@ -95,7 +111,7 @@ class AvgActivityVisitDuration implements ExportInterface, GroupedExportInterfac | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|   | ||||
| @@ -43,6 +43,21 @@ class CountActivity implements ExportInterface, GroupedExportInterface | ||||
|  | ||||
|     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 []; | ||||
| @@ -77,7 +92,7 @@ class CountActivity implements ExportInterface, GroupedExportInterface | ||||
|         return ['export_count_activity']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
| @@ -92,7 +107,7 @@ class CountActivity implements ExportInterface, GroupedExportInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|   | ||||
| @@ -44,6 +44,21 @@ final readonly class CountHouseholdOnActivity implements ExportInterface, Groupe | ||||
|  | ||||
|     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 []; | ||||
| @@ -78,7 +93,7 @@ final readonly class CountHouseholdOnActivity implements ExportInterface, Groupe | ||||
|         return ['export_count_activity']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
| @@ -93,7 +108,7 @@ final readonly class CountHouseholdOnActivity implements ExportInterface, Groupe | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|   | ||||
| @@ -43,6 +43,21 @@ class CountPersonsOnActivity implements ExportInterface, GroupedExportInterface | ||||
|  | ||||
|     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 []; | ||||
| @@ -77,7 +92,7 @@ class CountPersonsOnActivity implements ExportInterface, GroupedExportInterface | ||||
|         return ['export_count_activity']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
| @@ -92,7 +107,7 @@ class CountPersonsOnActivity implements ExportInterface, GroupedExportInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|   | ||||
| @@ -17,6 +17,7 @@ use Chill\ActivityBundle\Export\Export\ListActivityHelper; | ||||
| use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter; | ||||
| use Chill\MainBundle\Entity\Scope; | ||||
| use Chill\MainBundle\Export\AccompanyingCourseExportHelper; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\GroupedExportInterface; | ||||
| use Chill\MainBundle\Export\Helper\TranslatableStringExportLabelHelper; | ||||
| use Chill\MainBundle\Export\ListInterface; | ||||
| @@ -38,6 +39,21 @@ final readonly class ListActivity implements ListInterface, GroupedExportInterfa | ||||
|         $this->helper->buildForm($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 []; | ||||
| @@ -73,7 +89,7 @@ final readonly class ListActivity implements ListInterface, GroupedExportInterfa | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return | ||||
|             array_merge( | ||||
| @@ -85,25 +101,23 @@ final readonly class ListActivity implements ListInterface, GroupedExportInterfa | ||||
|             ); | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $this->helper->getResult($query, $data); | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return ListActivityHelper::MSG_KEY.'List activity linked to a course'; | ||||
|     } | ||||
|  | ||||
|     public function getType() | ||||
|     public function getType(): string | ||||
|     { | ||||
|         return $this->helper->getType(); | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|         $qb = $this->entityManager->createQueryBuilder(); | ||||
|  | ||||
|         $qb | ||||
| @@ -114,7 +128,7 @@ final readonly class ListActivity implements ListInterface, GroupedExportInterfa | ||||
|             ->leftJoin('acppart.person', 'person') | ||||
|             ->andWhere('acppart.startDate != acppart.endDate OR acppart.endDate IS NULL'); | ||||
|  | ||||
|         $this->filterListAccompanyingPeriodHelper->addFilterAccompanyingPeriods($qb, $requiredModifiers, $acl, $data); | ||||
|         $this->filterListAccompanyingPeriodHelper->addFilterAccompanyingPeriods($qb, $requiredModifiers, $acl, $context->byUser, $data); | ||||
|  | ||||
|         $qb | ||||
|             // some grouping are necessary | ||||
|   | ||||
| @@ -40,9 +40,21 @@ class SumActivityDuration implements ExportInterface, GroupedExportInterface | ||||
|         $this->filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center']; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         // TODO: Implement buildForm() method. | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
| @@ -79,7 +91,7 @@ class SumActivityDuration implements ExportInterface, GroupedExportInterface | ||||
|         return ['export_sum_activity_duration']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
| @@ -94,7 +106,7 @@ class SumActivityDuration implements ExportInterface, GroupedExportInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|   | ||||
| @@ -40,9 +40,21 @@ class SumActivityVisitDuration implements ExportInterface, GroupedExportInterfac | ||||
|         $this->filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center']; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         // TODO: Implement buildForm() method. | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
| @@ -79,7 +91,7 @@ class SumActivityVisitDuration implements ExportInterface, GroupedExportInterfac | ||||
|         return ['export_sum_activity_visit_duration']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
| @@ -94,7 +106,7 @@ class SumActivityVisitDuration implements ExportInterface, GroupedExportInterfac | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|   | ||||
| @@ -35,6 +35,21 @@ class CountActivity implements ExportInterface, GroupedExportInterface | ||||
|  | ||||
|     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 []; | ||||
| @@ -64,17 +79,17 @@ class CountActivity implements ExportInterface, GroupedExportInterface | ||||
|         return static fn ($value) => '_header' === $value ? 'Number of activities linked to a person' : $value; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return ['export_count_activity']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'Count activities linked to a person'; | ||||
|     } | ||||
| @@ -84,7 +99,7 @@ class CountActivity implements ExportInterface, GroupedExportInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|   | ||||
| @@ -36,6 +36,21 @@ final readonly class CountHouseholdOnActivity implements ExportInterface, Groupe | ||||
|  | ||||
|     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 []; | ||||
| @@ -65,17 +80,17 @@ final readonly class CountHouseholdOnActivity implements ExportInterface, Groupe | ||||
|         return static fn ($value) => '_header' === $value ? 'export.export.count_household_on_activity_person.header' : $value; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return ['export_count_activity']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'export.export.count_household_on_activity_person.title'; | ||||
|     } | ||||
| @@ -85,7 +100,7 @@ final readonly class CountHouseholdOnActivity implements ExportInterface, Groupe | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|   | ||||
| @@ -78,6 +78,21 @@ class ListActivity implements ListInterface, GroupedExportInterface | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['fields' => $formData['fields']]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['fields' => $formData['fields']]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
| @@ -167,17 +182,17 @@ class ListActivity implements ListInterface, GroupedExportInterface | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return $data['fields']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'List activity linked to a person'; | ||||
|     } | ||||
| @@ -187,7 +202,7 @@ class ListActivity implements ListInterface, GroupedExportInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|   | ||||
| @@ -49,6 +49,21 @@ class StatActivityDuration implements ExportInterface, GroupedExportInterface | ||||
|  | ||||
|     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 []; | ||||
| @@ -84,17 +99,17 @@ class StatActivityDuration implements ExportInterface, GroupedExportInterface | ||||
|         return static fn (string $value) => '_header' === $value ? $header : $value; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return ['export_stat_activity']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         if (self::SUM === $this->action) { | ||||
|             return 'Sum activity linked to a person duration'; | ||||
| @@ -108,7 +123,7 @@ class StatActivityDuration implements ExportInterface, GroupedExportInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map( | ||||
|             static fn (array $el): Center => $el['center'], | ||||
|   | ||||
| @@ -14,6 +14,7 @@ namespace Chill\ActivityBundle\Export\Filter\ACPFilters; | ||||
| use Chill\ActivityBundle\Entity\Activity; | ||||
| use Chill\ActivityBundle\Entity\ActivityType; | ||||
| use Chill\ActivityBundle\Repository\ActivityTypeRepositoryInterface; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Form\Type\PickRollingDateType; | ||||
| use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface; | ||||
| @@ -25,6 +26,7 @@ use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| final readonly class ActivityTypeFilter implements FilterInterface | ||||
| { | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|     private const BASE_EXISTS = 'SELECT 1 FROM '.Activity::class.' act_type_filter_activity WHERE act_type_filter_activity.accompanyingPeriod = acp'; | ||||
|  | ||||
|     public function __construct( | ||||
| @@ -38,7 +40,7 @@ final readonly class ActivityTypeFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $exists = self::BASE_EXISTS; | ||||
|  | ||||
| @@ -62,12 +64,12 @@ final readonly class ActivityTypeFilter implements FilterInterface | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return Declarations::ACP_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_activitytypes', EntityType::class, [ | ||||
|             'class' => ActivityType::class, | ||||
| @@ -92,6 +94,21 @@ final readonly class ActivityTypeFilter implements FilterInterface | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_activitytypes' => $this->normalizeDoctrineEntity($formData['accepted_activitytypes']), 'date_after' => $formData['date_after']?->normalize(), 'date_before' => $formData['date_before']?->normalize()]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_activitytypes' => $this->denormalizeDoctrineEntity($formData['accepted_activitytypes'], $this->activityTypeRepository), 'date_after' => \Chill\MainBundle\Service\RollingDate\RollingDate::fromNormalized($formData['date_after']), 'date_before' => \Chill\MainBundle\Service\RollingDate\RollingDate::fromNormalized($formData['date_before'])]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return [ | ||||
| @@ -101,7 +118,7 @@ final readonly class ActivityTypeFilter implements FilterInterface | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $types = []; | ||||
|  | ||||
|   | ||||
| @@ -12,23 +12,28 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Export\Filter\ACPFilters; | ||||
|  | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\PersonBundle\Entity\SocialWork\SocialAction; | ||||
| use Chill\PersonBundle\Form\Type\PickSocialActionType; | ||||
| use Chill\PersonBundle\Repository\SocialWork\SocialActionRepository; | ||||
| use Chill\PersonBundle\Templating\Entity\SocialActionRender; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| class BySocialActionFilter implements FilterInterface | ||||
| { | ||||
|     public function __construct(private readonly SocialActionRender $actionRender) {} | ||||
|     use ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct(private readonly SocialActionRender $actionRender, private readonly SocialActionRepository $socialActionRepository) {} | ||||
|  | ||||
|     public function addRole(): ?string | ||||
|     { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('actsocialaction', $qb->getAllAliases(), true)) { | ||||
|             $qb->join('activity.socialActions', 'actsocialaction'); | ||||
| @@ -48,19 +53,36 @@ class BySocialActionFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY_ACP; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_socialactions', PickSocialActionType::class, [ | ||||
|             'multiple' => true, | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return []; | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_socialactions' => $this->normalizeDoctrineEntity($formData['accepted_socialactions'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_socialactions' => $this->denormalizeDoctrineEntity($formData['accepted_socialactions'], $this->socialActionRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return [ | ||||
|             'accepted_socialactions' => [], | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $actions = []; | ||||
|  | ||||
|   | ||||
| @@ -12,23 +12,28 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Export\Filter\ACPFilters; | ||||
|  | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\PersonBundle\Entity\SocialWork\SocialIssue; | ||||
| use Chill\PersonBundle\Form\Type\PickSocialIssueType; | ||||
| use Chill\PersonBundle\Repository\SocialWork\SocialIssueRepository; | ||||
| use Chill\PersonBundle\Templating\Entity\SocialIssueRender; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| class BySocialIssueFilter implements FilterInterface | ||||
| { | ||||
|     public function __construct(private readonly SocialIssueRender $issueRender) {} | ||||
|     use ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct(private readonly SocialIssueRender $issueRender, private readonly SocialIssueRepository $issueRepository) {} | ||||
|  | ||||
|     public function addRole(): ?string | ||||
|     { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('actsocialissue', $qb->getAllAliases(), true)) { | ||||
|             $qb->join('activity.socialIssues', 'actsocialissue'); | ||||
| @@ -48,19 +53,34 @@ class BySocialIssueFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY_ACP; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_socialissues', PickSocialIssueType::class, [ | ||||
|             'multiple' => true, | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_socialissues' => $this->normalizeDoctrineEntity($formData['accepted_socialissues'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_socialissues' => $this->denormalizeDoctrineEntity($formData['accepted_socialissues'], $this->issueRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $issues = []; | ||||
|  | ||||
|   | ||||
| @@ -12,6 +12,7 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Export\Filter\ACPFilters; | ||||
|  | ||||
| use Chill\ActivityBundle\Entity\Activity; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\PersonBundle\Export\Declarations; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| @@ -27,7 +28,7 @@ class HasNoActivityFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb | ||||
|             ->andWhere(' | ||||
| @@ -43,17 +44,32 @@ class HasNoActivityFilter implements FilterInterface | ||||
|         return Declarations::ACP_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     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 describeAction($data, $format = 'string'): array | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         return ['Filtered acp which has no activities', []]; | ||||
|     } | ||||
|   | ||||
| @@ -12,6 +12,7 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Export\Filter\ACPFilters; | ||||
|  | ||||
| use Chill\ActivityBundle\Entity\Activity; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Form\Type\PickRollingDateType; | ||||
| use Chill\MainBundle\Service\RollingDate\RollingDate; | ||||
| @@ -25,12 +26,12 @@ final readonly class PeriodHavingActivityBetweenDatesFilter implements FilterInt | ||||
|         private RollingDateConverterInterface $rollingDateConverter, | ||||
|     ) {} | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'export.filter.activity.course_having_activity_between_date.Title'; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder | ||||
|             ->add('start_date', PickRollingDateType::class, [ | ||||
| @@ -41,6 +42,21 @@ final readonly class PeriodHavingActivityBetweenDatesFilter implements FilterInt | ||||
|             ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['start_date' => $formData['start_date']->normalize(), 'end_date' => $formData['end_date']->normalize()]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['start_date' => RollingDate::fromNormalized($formData['start_date']), 'end_date' => RollingDate::fromNormalized($formData['end_date'])]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return [ | ||||
| @@ -49,7 +65,7 @@ final readonly class PeriodHavingActivityBetweenDatesFilter implements FilterInt | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string') | ||||
|     public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array | ||||
|     { | ||||
|         return [ | ||||
|             'export.filter.activity.course_having_activity_between_date.Only course having an activity between from and to', | ||||
| @@ -65,7 +81,7 @@ final readonly class PeriodHavingActivityBetweenDatesFilter implements FilterInt | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $alias = 'act_period_having_act_betw_date_alias'; | ||||
|         $from = 'act_period_having_act_betw_date_start'; | ||||
| @@ -82,7 +98,7 @@ final readonly class PeriodHavingActivityBetweenDatesFilter implements FilterInt | ||||
|             ->setParameter($to, $this->rollingDateConverter->convert($data['end_date'])); | ||||
|     } | ||||
|  | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return \Chill\PersonBundle\Export\Declarations::ACP_TYPE; | ||||
|     } | ||||
|   | ||||
| @@ -12,6 +12,7 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Export\Filter; | ||||
|  | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Form\Type\PickRollingDateType; | ||||
| use Chill\MainBundle\Service\RollingDate\RollingDate; | ||||
| @@ -30,7 +31,7 @@ class ActivityDateFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $where = $qb->getDQLPart('where'); | ||||
|         $clause = $qb->expr()->between( | ||||
| @@ -61,7 +62,7 @@ class ActivityDateFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder | ||||
|             ->add('date_from', PickRollingDateType::class, [ | ||||
| @@ -72,12 +73,27 @@ class ActivityDateFilter implements FilterInterface | ||||
|             ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['date_from' => $formData['date_from']->normalize(), 'date_to' => $formData['date_to']->normalize()]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['date_from' => RollingDate::fromNormalized($formData['date_from']), 'date_to' => RollingDate::fromNormalized($formData['date_to'])]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return ['date_from' => new RollingDate(RollingDate::T_YEAR_PREVIOUS_START), 'date_to' => new RollingDate(RollingDate::T_TODAY)]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string') | ||||
|     public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array | ||||
|     { | ||||
|         return [ | ||||
|             'Filtered by date of activity: only between %date_from% and %date_to%', | ||||
| @@ -88,7 +104,7 @@ class ActivityDateFilter implements FilterInterface | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'Filtered by date activity'; | ||||
|     } | ||||
|   | ||||
| @@ -13,6 +13,8 @@ namespace Chill\ActivityBundle\Export\Filter; | ||||
|  | ||||
| use Chill\ActivityBundle\Entity\ActivityPresence; | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\ActivityBundle\Repository\ActivityPresenceRepositoryInterface; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Templating\TranslatableStringHelperInterface; | ||||
| use Doctrine\Common\Collections\Collection; | ||||
| @@ -23,17 +25,20 @@ use Symfony\Contracts\Translation\TranslatorInterface; | ||||
|  | ||||
| final readonly class ActivityPresenceFilter implements FilterInterface | ||||
| { | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct( | ||||
|         private TranslatableStringHelperInterface $translatableStringHelper, | ||||
|         private TranslatorInterface $translator, | ||||
|         private ActivityPresenceRepositoryInterface $activityPresenceRepository, | ||||
|     ) {} | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'export.filter.activity.by_presence.Filter activity by activity presence'; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('presences', EntityType::class, [ | ||||
|             'class' => ActivityPresence::class, | ||||
| @@ -45,12 +50,27 @@ final readonly class ActivityPresenceFilter implements FilterInterface | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['presences' => $this->normalizeDoctrineEntity($formData['presences'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['presences' => $this->denormalizeDoctrineEntity($formData['presences'], $this->activityPresenceRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string') | ||||
|     public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array | ||||
|     { | ||||
|         $presences = array_map( | ||||
|             fn (ActivityPresence $presence) => $this->translatableStringHelper->localize($presence->getName()), | ||||
| @@ -68,14 +88,14 @@ final readonly class ActivityPresenceFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb | ||||
|             ->andWhere('activity.attendee IN (:activity_presence_filter_presences)') | ||||
|             ->setParameter('activity_presence_filter_presences', $data['presences']); | ||||
|     } | ||||
|  | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|   | ||||
| @@ -15,6 +15,7 @@ use Chill\ActivityBundle\Entity\ActivityType; | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\ActivityBundle\Repository\ActivityTypeRepositoryInterface; | ||||
| use Chill\MainBundle\Export\ExportElementValidatedInterface; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Templating\TranslatableStringHelperInterface; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| @@ -24,6 +25,8 @@ use Symfony\Component\Validator\Context\ExecutionContextInterface; | ||||
|  | ||||
| class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInterface | ||||
| { | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct( | ||||
|         protected TranslatableStringHelperInterface $translatableStringHelper, | ||||
|         protected ActivityTypeRepositoryInterface $activityTypeRepository, | ||||
| @@ -34,7 +37,7 @@ class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInter | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $clause = $qb->expr()->in('activity.activityType', ':selected_activity_types'); | ||||
|  | ||||
| @@ -47,7 +50,7 @@ class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInter | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('types', EntityType::class, [ | ||||
|             'choices' => $this->activityTypeRepository->findAllActive(), | ||||
| @@ -70,12 +73,27 @@ class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInter | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['types' => $this->normalizeDoctrineEntity($formData['types'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['types' => $this->denormalizeDoctrineEntity($formData['types'], $this->activityTypeRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string') | ||||
|     public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array | ||||
|     { | ||||
|         // collect all the reasons'name used in this filter in one array | ||||
|         $reasonsNames = array_map( | ||||
| @@ -88,12 +106,12 @@ class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInter | ||||
|         ]]; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'Filter by activity type'; | ||||
|     } | ||||
|  | ||||
|     public function validateForm($data, ExecutionContextInterface $context) | ||||
|     public function validateForm($data, ExecutionContextInterface $context): void | ||||
|     { | ||||
|         if (null === $data['types'] || 0 === \count($data['types'])) { | ||||
|             $context | ||||
|   | ||||
| @@ -12,26 +12,30 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Export\Filter; | ||||
|  | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Form\Type\PickUserDynamicType; | ||||
| use Chill\MainBundle\Form\Type\PickUserOrMeDynamicType; | ||||
| use Chill\MainBundle\Repository\UserRepositoryInterface; | ||||
| use Chill\MainBundle\Templating\Entity\UserRender; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| class ActivityUsersFilter implements FilterInterface | ||||
| final readonly class ActivityUsersFilter implements FilterInterface | ||||
| { | ||||
|     public function __construct(private readonly UserRender $userRender) {} | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct(private UserRender $userRender, private UserRepositoryInterface $userRepository) {} | ||||
|  | ||||
|     public function addRole(): ?string | ||||
|     { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $orX = $qb->expr()->orX(); | ||||
|  | ||||
|         foreach ($data['accepted_users'] as $key => $user) { | ||||
|         foreach ($this->userOrMe($data['accepted_users'], $exportGenerationContext) as $key => $user) { | ||||
|             $orX->add($qb->expr()->isMemberOf(':activity_users_filter_u'.$key, 'activity.users')); | ||||
|             $qb->setParameter('activity_users_filter_u'.$key, $user); | ||||
|         } | ||||
| @@ -39,29 +43,44 @@ class ActivityUsersFilter implements FilterInterface | ||||
|         $qb->andWhere($orX); | ||||
|     } | ||||
|  | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_users', PickUserDynamicType::class, [ | ||||
|         $builder->add('accepted_users', PickUserOrMeDynamicType::class, [ | ||||
|             'multiple' => true, | ||||
|             'label' => 'Users', | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_users' => $this->normalizeUserOrMe($formData['accepted_users'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_users' => $this->denormalizeUserOrMe($formData['accepted_users'], $this->userRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string') | ||||
|     public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array | ||||
|     { | ||||
|         $users = []; | ||||
|  | ||||
|         foreach ($data['accepted_users'] as $u) { | ||||
|         foreach ($this->userOrMe($data['accepted_users'], $context) as $u) { | ||||
|             $users[] = $this->userRender->renderString($u, []); | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -12,28 +12,32 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Export\Filter; | ||||
|  | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Form\Type\PickUserDynamicType; | ||||
| use Chill\MainBundle\Form\Type\PickUserOrMeDynamicType; | ||||
| use Chill\MainBundle\Repository\UserRepositoryInterface; | ||||
| use Chill\MainBundle\Templating\Entity\UserRender; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| class ByCreatorFilter implements FilterInterface | ||||
| { | ||||
|     public function __construct(private readonly UserRender $userRender) {} | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct(private readonly UserRender $userRender, private readonly UserRepositoryInterface $userRepository) {} | ||||
|  | ||||
|     public function addRole(): ?string | ||||
|     { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb | ||||
|             ->andWhere( | ||||
|                 $qb->expr()->in('activity.createdBy', ':users') | ||||
|             ) | ||||
|             ->setParameter('users', $data['accepted_users']); | ||||
|             ->setParameter('users', $this->userOrMe($data['accepted_users'], $exportGenerationContext)); | ||||
|     } | ||||
|  | ||||
|     public function applyOn(): string | ||||
| @@ -41,23 +45,38 @@ class ByCreatorFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_users', PickUserDynamicType::class, [ | ||||
|         $builder->add('accepted_users', PickUserOrMeDynamicType::class, [ | ||||
|             'multiple' => true, | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_users' => $this->normalizeUserOrMe($formData['accepted_users'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_users' => $this->denormalizeUserOrMe($formData['accepted_users'], $this->userRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $users = []; | ||||
|  | ||||
|         foreach ($data['accepted_users'] as $u) { | ||||
|         foreach ($this->userOrMe($data['accepted_users'], $context) as $u) { | ||||
|             $users[] = $this->userRender->renderString($u, []); | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -14,6 +14,7 @@ namespace Chill\ActivityBundle\Export\Filter; | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Entity\User\UserJobHistory; | ||||
| use Chill\MainBundle\Entity\UserJob; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Repository\UserJobRepositoryInterface; | ||||
| use Chill\MainBundle\Templating\TranslatableStringHelper; | ||||
| @@ -26,6 +27,7 @@ use Symfony\Contracts\Translation\TranslatorInterface; | ||||
|  | ||||
| final readonly class CreatorJobFilter implements FilterInterface | ||||
| { | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|     private const PREFIX = 'acp_act_filter_creator_job'; | ||||
|  | ||||
|     public function __construct( | ||||
| @@ -39,7 +41,7 @@ final readonly class CreatorJobFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -75,7 +77,7 @@ final readonly class CreatorJobFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder | ||||
|             ->add('jobs', EntityType::class, [ | ||||
| @@ -90,7 +92,22 @@ final readonly class CreatorJobFilter implements FilterInterface | ||||
|             ]); | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['jobs' => $this->normalizeDoctrineEntity($formData['jobs'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['jobs' => $this->denormalizeDoctrineEntity($formData['jobs'], $this->userJobRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $jobs = array_map( | ||||
|             fn (UserJob $job) => $this->translatableStringHelper->localize($job->getLabel()), | ||||
|   | ||||
| @@ -14,6 +14,7 @@ namespace Chill\ActivityBundle\Export\Filter; | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Entity\Scope; | ||||
| use Chill\MainBundle\Entity\User\UserScopeHistory; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Repository\ScopeRepositoryInterface; | ||||
| use Chill\MainBundle\Templating\TranslatableStringHelper; | ||||
| @@ -24,6 +25,7 @@ use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| class CreatorScopeFilter implements FilterInterface | ||||
| { | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|     private const PREFIX = 'acp_act_filter_creator_scope'; | ||||
|  | ||||
|     public function __construct( | ||||
| @@ -36,7 +38,7 @@ class CreatorScopeFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -72,7 +74,7 @@ class CreatorScopeFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder | ||||
|             ->add('scopes', EntityType::class, [ | ||||
| @@ -86,7 +88,22 @@ class CreatorScopeFilter implements FilterInterface | ||||
|             ]); | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['scopes' => $this->normalizeDoctrineEntity($formData['scopes'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['scopes' => $this->denormalizeDoctrineEntity($formData['scopes'], $this->scopeRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $scopes = []; | ||||
|  | ||||
|   | ||||
| @@ -12,6 +12,7 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Export\Filter; | ||||
|  | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Doctrine\ORM\Query\Expr\Andx; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| @@ -35,7 +36,7 @@ class EmergencyFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $where = $qb->getDQLPart('where'); | ||||
|  | ||||
| @@ -56,7 +57,7 @@ class EmergencyFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_emergency', ChoiceType::class, [ | ||||
|             'choices' => self::CHOICES, | ||||
| @@ -66,12 +67,27 @@ class EmergencyFilter implements FilterInterface | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_emergency' => $formData['accepted_emergency']]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_emergency' => $formData['accepted_emergency']]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return ['accepted_emergency' => self::DEFAULT_CHOICE]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         return [ | ||||
|             'Filtered by emergency: only %emergency%', [ | ||||
|   | ||||
| @@ -12,19 +12,27 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Export\Filter; | ||||
|  | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Form\Type\PickUserLocationType; | ||||
| use Chill\MainBundle\Repository\LocationRepository; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| class LocationFilter implements FilterInterface | ||||
| final readonly class LocationFilter implements FilterInterface | ||||
| { | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct( | ||||
|         private LocationRepository $locationRepository, | ||||
|     ) {} | ||||
|  | ||||
|     public function addRole(): ?string | ||||
|     { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb->andWhere( | ||||
|             $qb->expr()->in('activity.location', ':location') | ||||
| @@ -38,7 +46,7 @@ class LocationFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_location', PickUserLocationType::class, [ | ||||
|             'multiple' => true, | ||||
| @@ -46,12 +54,27 @@ class LocationFilter implements FilterInterface | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_location' => $this->normalizeDoctrineEntity($formData['accepted_location'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_location' => $this->denormalizeDoctrineEntity($formData['accepted_location'], $this->locationRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $locations = []; | ||||
|  | ||||
|   | ||||
| @@ -12,8 +12,11 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Export\Filter; | ||||
|  | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Form\Type\PickLocationTypeType; | ||||
| use Chill\MainBundle\Repository\LocationTypeRepository; | ||||
| use Chill\MainBundle\Templating\TranslatableStringHelper; | ||||
| use Doctrine\ORM\Query\Expr\Andx; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| @@ -21,14 +24,16 @@ use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| class LocationTypeFilter implements FilterInterface | ||||
| { | ||||
|     public function __construct(private readonly TranslatableStringHelper $translatableStringHelper) {} | ||||
|     use ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct(private readonly TranslatableStringHelper $translatableStringHelper, private LocationTypeRepository $locationTypeRepository) {} | ||||
|  | ||||
|     public function addRole(): ?string | ||||
|     { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('actloc', $qb->getAllAliases(), true)) { | ||||
|             $qb->join('activity.location', 'actloc'); | ||||
| @@ -52,7 +57,7 @@ class LocationTypeFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_locationtype', PickLocationTypeType::class, [ | ||||
|             'multiple' => true, | ||||
| @@ -60,12 +65,27 @@ class LocationTypeFilter implements FilterInterface | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return []; | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_locationtype' => $this->normalizeDoctrineEntity($formData['accepted_locationtype'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_locationtype' => $this->denormalizeDoctrineEntity($formData['accepted_locationtype'], $this->locationTypeRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return ['accepted_locationtype' => []]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $types = []; | ||||
|  | ||||
|   | ||||
| @@ -15,6 +15,7 @@ use Chill\ActivityBundle\Entity\ActivityReason; | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\ActivityBundle\Repository\ActivityReasonRepository; | ||||
| use Chill\MainBundle\Export\ExportElementValidatedInterface; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Templating\TranslatableStringHelper; | ||||
| use Doctrine\Common\Collections\Collection; | ||||
| @@ -26,6 +27,8 @@ use Symfony\Component\Validator\Context\ExecutionContextInterface; | ||||
|  | ||||
| class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInterface | ||||
| { | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct(protected TranslatableStringHelper $translatableStringHelper, protected ActivityReasonRepository $activityReasonRepository) {} | ||||
|  | ||||
|     public function addRole(): ?string | ||||
| @@ -33,7 +36,7 @@ class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInt | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $where = $qb->getDQLPart('where'); | ||||
|         $join = $qb->getDQLPart('join'); | ||||
| @@ -58,7 +61,7 @@ class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInt | ||||
|         return Declarations::ACTIVITY_PERSON; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('reasons', EntityType::class, [ | ||||
|             'class' => ActivityReason::class, | ||||
| @@ -70,12 +73,27 @@ class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInt | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['reasons' => $this->normalizeDoctrineEntity($formData['reasons'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['reasons' => $this->denormalizeDoctrineEntity($formData['reasons'], $this->activityReasonRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string') | ||||
|     public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array | ||||
|     { | ||||
|         // collect all the reasons'name used in this filter in one array | ||||
|         $reasonsNames = array_map( | ||||
| @@ -91,12 +109,12 @@ class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInt | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'Filter by reason'; | ||||
|     } | ||||
|  | ||||
|     public function validateForm($data, ExecutionContextInterface $context) | ||||
|     public function validateForm($data, ExecutionContextInterface $context): void | ||||
|     { | ||||
|         if (null === $data['reasons'] || 0 === \count($data['reasons'])) { | ||||
|             $context | ||||
|   | ||||
| @@ -15,6 +15,7 @@ use Chill\ActivityBundle\Entity\Activity; | ||||
| use Chill\ActivityBundle\Entity\ActivityReason; | ||||
| use Chill\ActivityBundle\Repository\ActivityReasonRepository; | ||||
| use Chill\MainBundle\Export\ExportElementValidatedInterface; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Form\Type\PickRollingDateType; | ||||
| use Chill\MainBundle\Service\RollingDate\RollingDate; | ||||
| @@ -39,7 +40,7 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data): void | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         // create a subquery for activity | ||||
|         $sqb = $qb->getEntityManager()->createQueryBuilder(); | ||||
| @@ -92,7 +93,7 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem | ||||
|         return Declarations::PERSON_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('date_from_rolling', PickRollingDateType::class, [ | ||||
|             'label' => 'export.filter.activity.person_between_dates.Implied in an activity after this date', | ||||
| @@ -116,6 +117,21 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         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 | ||||
|     { | ||||
|         return ['date_from_rolling' => RollingDate::fromNormalized($formData['date_from_rolling']), 'date_to_rolling' => RollingDate::fromNormalized($formData['date_to_rolling'])]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return [ | ||||
| @@ -125,7 +141,7 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         return [ | ||||
|             [] === $data['reasons'] ? | ||||
| @@ -150,7 +166,7 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem | ||||
|         return 'export.filter.activity.person_between_dates.title'; | ||||
|     } | ||||
|  | ||||
|     public function validateForm($data, ExecutionContextInterface $context) | ||||
|     public function validateForm($data, ExecutionContextInterface $context): void | ||||
|     { | ||||
|         if ($this->rollingDateConverter->convert($data['date_from_rolling']) | ||||
|             >= $this->rollingDateConverter->convert($data['date_to_rolling'])) { | ||||
|   | ||||
| @@ -13,6 +13,7 @@ namespace Chill\ActivityBundle\Export\Filter; | ||||
|  | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\ActivityBundle\Tests\Export\Filter\PersonsFilterTest; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\PersonBundle\Form\Type\PickPersonDynamicType; | ||||
| use Chill\PersonBundle\Templating\Entity\PersonRenderInterface; | ||||
| @@ -33,7 +34,7 @@ final readonly class PersonsFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -47,12 +48,12 @@ final readonly class PersonsFilter implements FilterInterface | ||||
|         $qb->andWhere($orX); | ||||
|     } | ||||
|  | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_persons', PickPersonDynamicType::class, [ | ||||
|             'multiple' => true, | ||||
| @@ -60,6 +61,21 @@ final readonly class PersonsFilter implements FilterInterface | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_persons' => $formData['accepted_persons']]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_persons' => $formData['accepted_persons']]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return [ | ||||
| @@ -67,7 +83,7 @@ final readonly class PersonsFilter implements FilterInterface | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string') | ||||
|     public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array | ||||
|     { | ||||
|         $users = []; | ||||
|  | ||||
|   | ||||
| @@ -13,6 +13,7 @@ namespace Chill\ActivityBundle\Export\Filter; | ||||
|  | ||||
| use Chill\ActivityBundle\Entity\Activity; | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Doctrine\ORM\Query\Expr\Andx; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| @@ -36,7 +37,7 @@ class SentReceivedFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $where = $qb->getDQLPart('where'); | ||||
|  | ||||
| @@ -57,7 +58,7 @@ class SentReceivedFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_sentreceived', ChoiceType::class, [ | ||||
|             'choices' => self::CHOICES, | ||||
| @@ -68,12 +69,27 @@ class SentReceivedFilter implements FilterInterface | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_sentreceived' => $formData['accepted_sentreceived']]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_sentreceived' => $formData['accepted_sentreceived']]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return ['accepted_sentreceived' => self::DEFAULT_CHOICE]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $sentreceived = array_flip(self::CHOICES)[$data['accepted_sentreceived']]; | ||||
|  | ||||
|   | ||||
| @@ -12,23 +12,27 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Export\Filter; | ||||
|  | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Form\Type\PickUserDynamicType; | ||||
| use Chill\MainBundle\Form\Type\PickUserOrMeDynamicType; | ||||
| use Chill\MainBundle\Repository\UserRepositoryInterface; | ||||
| use Chill\MainBundle\Templating\Entity\UserRender; | ||||
| use Doctrine\ORM\Query\Expr\Andx; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| class UserFilter implements FilterInterface | ||||
| final readonly class UserFilter implements FilterInterface | ||||
| { | ||||
|     public function __construct(private readonly UserRender $userRender) {} | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct(private UserRender $userRender, private UserRepositoryInterface $userRepository) {} | ||||
|  | ||||
|     public function addRole(): ?string | ||||
|     { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $where = $qb->getDQLPart('where'); | ||||
|  | ||||
| @@ -41,7 +45,7 @@ class UserFilter implements FilterInterface | ||||
|         } | ||||
|  | ||||
|         $qb->add('where', $where); | ||||
|         $qb->setParameter('users', $data['accepted_users']); | ||||
|         $qb->setParameter('users', $this->userOrMe($data['accepted_users'], $exportGenerationContext)); | ||||
|     } | ||||
|  | ||||
|     public function applyOn(): string | ||||
| @@ -49,24 +53,39 @@ class UserFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_users', PickUserDynamicType::class, [ | ||||
|         $builder->add('accepted_users', PickUserOrMeDynamicType::class, [ | ||||
|             'multiple' => true, | ||||
|             'label' => 'Creators', | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_users' => $this->normalizeUserOrMe($formData['accepted_users'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_users' => $this->denormalizeUserOrMe($formData['accepted_users'], $this->userRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $users = []; | ||||
|  | ||||
|         foreach ($data['accepted_users'] as $u) { | ||||
|         foreach ($this->userOrMe($data['accepted_users'], $context) as $u) { | ||||
|             $users[] = $this->userRender->renderString($u, []); | ||||
|         } | ||||
|  | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user