Compare commits

..

2 Commits

Author SHA1 Message Date
e3cde28d3b Fix package.json 2025-06-05 10:41:29 +02:00
7433bf91e7 Fix loading of classlists in SocialIssuesAcc.vue 2025-06-05 10:13:23 +02:00
770 changed files with 7933 additions and 25015 deletions

View File

@@ -0,0 +1,6 @@
kind: DX
body: Remove dead code for wopi-link module
time: 2025-04-30T14:45:50.406111606+02:00
custom:
Issue: "352"
SchemaChange: No schema change

View File

@@ -0,0 +1,6 @@
kind: DX
body: Replace library node-sass by sass, and upgrade bootstrap to version 5.3 (yarn upgrade / install is required)
time: 2025-05-28T16:58:13.226870341+02:00
custom:
Issue: ""
SchemaChange: No schema change

View File

@@ -0,0 +1,7 @@
kind: Feature
body: Add the document file name to the document title when a user upload a document,
unless there is already a document title.
time: 2025-04-24T14:22:11.800975422+02:00
custom:
Issue: "377"
SchemaChange: No schema change

View File

@@ -0,0 +1,6 @@
kind: Feature
body: Add desactivation date for social action and issue csv export
time: 2025-05-20T09:56:28.108941934+02:00
custom:
Issue: ""
SchemaChange: No schema change

View File

@@ -0,0 +1,6 @@
kind: Feature
body: Add Emoji and Fullscreen feature to ckeditor configuration
time: 2025-05-23T13:33:41.645095128+02:00
custom:
Issue: ""
SchemaChange: No schema change

View File

@@ -0,0 +1,6 @@
kind: Feature
body: Create editor which allow us to toggle between rich and simple text editor
time: 2025-05-23T13:34:34.56795603+02:00
custom:
Issue: "321"
SchemaChange: No schema change

View File

@@ -0,0 +1,7 @@
kind: Fixed
body: trying to prevent bug of typeerror in doc-history + improved display of document
history
time: 2025-04-24T13:39:43.878468232+02:00
custom:
Issue: "376"
SchemaChange: No schema change

View File

@@ -0,0 +1,7 @@
kind: Fixed
body: Display previous participation in acc course work even if the person has left
the acc course
time: 2025-04-24T16:37:46.970203594+02:00
custom:
Issue: "381"
SchemaChange: No schema change

View File

@@ -0,0 +1,6 @@
kind: Fixed
body: Fix display of text in calendar events
time: 2025-05-05T10:27:15.461493066+02:00
custom:
Issue: "372"
SchemaChange: No schema change

View File

@@ -0,0 +1,6 @@
kind: Fixed
body: Add missing translation for user_group.no_user_groups
time: 2025-05-14T14:53:39.53927329+02:00
custom:
Issue: ""
SchemaChange: No schema change

View File

@@ -0,0 +1,6 @@
kind: Fixed
body: Fix loading of classLists in SocialIssuesAcc.vue, ensure elements are present
time: 2025-06-05T10:13:14.351260769+02:00
custom:
Issue: ""
SchemaChange: No schema change

View File

@@ -0,0 +1,6 @@
kind: UX
body: Remove default filter in_progress for the page 'my tasks'; Allows for new tasks to be displayed upon opening of the page
time: 2025-04-23T17:26:24.45777387+02:00
custom:
Issue: "374"
SchemaChange: No schema change

View File

@@ -1,22 +0,0 @@
## v3.12.0 - 2025-06-30
### Feature
* ([#377](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/377)) Add the document file name to the document title when a user upload a document, unless there is already a document title.
* Add desactivation date for social action and issue csv export
* Add Emoji and Fullscreen feature to ckeditor configuration
* ([#321](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/321)) Create editor which allow us to toggle between rich and simple text editor
* Do not remove workflow which are automatically canceled after staling for more than 30 days
### Fixed
* ([#376](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/376)) trying to prevent bug of typeerror in doc-history + improved display of document history
* ([#381](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/381)) Display previous participation in acc course work even if the person has left the acc course
* ([#372](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/372)) Fix display of text in calendar events
* Add missing translation for user_group.no_user_groups
* Fix admin entity edit actions for event admin entities and activity reason (category) entities
* ([#392](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/392)) Allow null and cast as string to setContent method for NewsItem
* ([#393](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/393)) Doc Generation: the "dump only" method send the document as an email attachment.
### DX
* ([#352](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/352)) Remove dead code for wopi-link module
* Replace library node-sass by sass, and upgrade bootstrap to version 5.3 (yarn upgrade / install is required)
### UX
* ([#374](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/374)) Remove default filter in_progress for the page 'my tasks'; Allows for new tasks to be displayed upon opening of the page
* Improve labeling of fields in person resource creation form

View File

@@ -1,3 +0,0 @@
## v3.12.1 - 2025-06-30
### Fixed
* Fix loading of the list of documents

View File

@@ -1,74 +0,0 @@
## v4.0.0 - 2025-07-08
### Feature
* ([#359](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/359)) Allow the merge of two accompanying period works
### Fixed
* ([#390](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/390)) Display the list of participant in the results, even if there is only one participant and that the search result display the requestor
* Fix admin entity edit actions for event admin entities and activity reason (category) entities
* Fix translations for social action fields in admin form: results, goals, evaluations
### DX
* Rewrite exports to run them asynchronously
**Schema Change**: Add columns or tables
* Allow TranslatableMessage in flash messages
### UX
* Improve labeling of fields in person resource creation form
**Release notes**
- Add new methods to serialize data using the rector rule
- Remove all references to the Request in filters, aggregators, filters. Actually, the most frequent occurence is `$security->getUser()`.
- Refactor manually the initializeQuery method
- Remove the injection of ExportManager into the constructor of each export element:
```diff
- class MyFormatter implements FormatterInterface
+ class MyFormatter implements FormatterInterface, \Chill\MainBundle\Export\ExportManagerAwareInterface
{
+ use \Chill\MainBundle\Export\Helper\ExportManagerAwareTrait;
- public function __construct(private ExportManager $exportmanager) {}
public function MyMethod(): void
{
- $this->exportManager->getFilter('alias');
+ $this->getExportManager()->getFilter('alias');
}
}
```
- configure messenger to handle export in a queue:
```diff
# config/packages/messenger.yaml
framework:
messenger:
routing:
+ 'Chill\MainBundle\Export\Messenger\ExportRequestGenerationMessage': priority
```
- add missing methods to exports, aggregators, filters, formatter:
```php
public function normalizeFormData(array $formData): array;
public function denormalizeFormData(array $formData, int $fromVersion): array;
```
There are rector rules to generate those methods:
- `Chill\Utils\Rector\Rector\ChillBundleAddNormalizationMethodsOnExportRector`
See:
```php
// upgrade chill exports
$rectorConfig->rules([\Chill\Utils\Rector\Rector\ChillBundleAddNormalizationMethodsOnExportRector::class]);
```
This rule will create most of the work necessary, but some manuals changes are still necessary:
- we must set manually the correct repository for method `denormalizeDoctrineEntity`;
- when the form data contains some entities, and the form type is not one of EntityType::class, PickUserDynamicType::class, PickUserLocationType::class, PickThirdpartyDynamicType::class, Select2CountryType::class, then we must handle the normalization manually (using the `\Chill\MainBundle\Export\ExportDataNormalizerTrait`)

View File

@@ -1,4 +0,0 @@
## v4.0.1 - 2025-07-08
### Fixed
* Fix package.json for compilation

View File

@@ -1,4 +0,0 @@
## v4.0.2 - 2025-07-09
### Fixed
* Fix add missing translation
* Fix the transfer of evaluations and documents during of accompanyingperiodwork

View File

@@ -1,12 +0,0 @@
## v4.1.0 - 2025-08-26
### Feature
* ([#400](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/400)) Add filter to social actions list to filter out actions where current user intervenes
* ([#399](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/399)) Show filters on list pages unfolded by default
* Expansion of event module with new fields in the creation form: thematic, internal/external animator, responsable, and budget elements. Filtering options in the event list + adapted exports
**Schema Change**: Add columns or tables
### Fixed
* ([#382](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/382)) adjust display logic for accompanying period dates, include closing date if period is closed.
* ([#384](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/384)) add min and step attributes to integer field in DateIntervalType
### UX
* Limit display of participations in event list

View File

@@ -1,10 +0,0 @@
## v4.2.0 - 2025-09-02
### Feature
* ([#64](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/64)) Add external identifier for a Person
**Schema Change**: Add columns or tables
* ([#330](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/330) Allow users to choose for which notifications they want to receive an email
### Fixed
* ([#422](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/422)) Fixed html layout of pages for recovering password
* Fix typo in 'uncheckAll' script for centers selection
* Fix incorrect parameter name in event details link

View File

@@ -1,6 +0,0 @@
## v4.2.1 - 2025-09-03
### Fixed
* Fix exports to work with DirectExportInterface
### DX
* Improve error message when a stored object cannot be written on local disk

View File

@@ -7,6 +7,14 @@
"message": "'app' is assigned a value but never used.", "message": "'app' is assigned a value but never used.",
"hash": "f8c2979921289906e3baabae31ba101ead91504f" "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", "path": "src/Bundle/ChillCalendarBundle/Resources/public/module/Invite/answer.js",
"line": 7, "line": 7,
@@ -119,6 +127,46 @@
"message": "'payload' is defined but never used.", "message": "'payload' is defined but never used.",
"hash": "66c545917093ba30f1d6ca10ddaa676140e749bd" "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", "path": "src/Bundle/ChillCalendarBundle/Resources/public/vuejs/MyCalendarRange/Components/EditLocation.vue",
"line": 77, "line": 77,
@@ -351,6 +399,14 @@
"message": "'error' is defined but never used.", "message": "'error' is defined but never used.",
"hash": "e26e5e101e90d2b7ee84d6f5de8c819e52129c17" "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", "path": "src/Bundle/ChillDocStoreBundle/Resources/public/module/async_upload/uploader.js",
"line": 39, "line": 39,
@@ -559,6 +615,14 @@
"message": "'ref' is defined but never used.", "message": "'ref' is defined but never used.",
"hash": "2a27cd6d06a26e1326654c929068e3704137e24b" "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", "path": "src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/WopiEditButton.vue",
"line": 15, "line": 15,
@@ -919,6 +983,22 @@
"message": "'_e' is defined but never used.", "message": "'_e' is defined but never used.",
"hash": "1d6448401778e8c56554020fe5abd47851ed33f3" "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", "path": "src/Bundle/ChillMainBundle/Resources/public/page/homepage_widget/index.js",
"line": 9, "line": 9,
@@ -1009,19 +1089,115 @@
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue",
"line": 516, "line": 247,
"column": 21, "column": 5,
"ruleId": "vue/no-mutating-props", "ruleId": "@typescript-eslint/no-unused-vars",
"message": "Unexpected mutation of \"context\" prop.", "message": "'postAddressToPerson' is defined but never used.",
"hash": "984c4203f2ac1e1bb65f9ce76ecd03b763cfaa83" "hash": "8a41c437cf2b5554cbbe1704cd51f3102b3d5994"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue",
"line": 517, "line": 248,
"column": 5,
"ruleId": "@typescript-eslint/no-unused-vars",
"message": "'postAddressToHousehold' is defined but never used.",
"hash": "66dec84b2ece299daf21308e5e60d497ba442b27"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue",
"line": 490,
"column": 21, "column": 21,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"context\" prop.", "message": "Unexpected mutation of \"context\" prop.",
"hash": "c9fb019bc21bfa77d989ed596913b99dd653c594" "hash": "0d3f40c47974a4371072b3b9ee04b197c830162d"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue",
"line": 491,
"column": 21,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"context\" prop.",
"hash": "8e877b7e588c30e182f7b572bdb9685360f9cf99"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue",
"line": 508,
"column": 47,
"ruleId": "@typescript-eslint/no-unused-vars",
"message": "'reject' is defined but never used.",
"hash": "5a3e3401bc3c765d91faaf4cfde57697af1262b7"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue",
"line": 525,
"column": 47,
"ruleId": "@typescript-eslint/no-unused-vars",
"message": "'reject' is defined but never used.",
"hash": "35a741d90379574b9323279f5802193d0c98a9dc"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue",
"line": 553,
"column": 47,
"ruleId": "@typescript-eslint/no-unused-vars",
"message": "'reject' is defined but never used.",
"hash": "c23d1ddf6c0d10ae97948e74aee9c14b9320b86c"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue",
"line": 572,
"column": 47,
"ruleId": "@typescript-eslint/no-unused-vars",
"message": "'reject' is defined but never used.",
"hash": "4322e81c6ea9d9734c680633a724d5bd4fabacb2"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue",
"line": 803,
"column": 47,
"ruleId": "@typescript-eslint/no-unused-vars",
"message": "'reject' is defined but never used.",
"hash": "7928a6461b9d394c7d97f048933553936f7d8963"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress.vue",
"line": 852,
"column": 47,
"ruleId": "@typescript-eslint/no-unused-vars",
"message": "'reject' is defined but never used.",
"hash": "e5afdb8efccb5470a08dde48f755b1268fa947b5"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressMore.vue",
"line": 93,
"column": 17,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "68f5e1cf5c03f9ada59c9e0afca0b74c7f3fca4b"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressMore.vue",
"line": 101,
"column": 17,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "50d730f6109092baff2db66adc44dc1315e2bda2"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressMore.vue",
"line": 109,
"column": 17,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "573e4c041ce663f28b933d7a675c2a525aba644c"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressMore.vue",
"line": 117,
"column": 17,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "293f845eeab515b1df4649d136c2d8219ed59c4d"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressMore.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressMore.vue",
@@ -1048,180 +1224,204 @@
"hash": "2d5a5e680ff207ad97c7e7b7d999064b561dfd8a" "hash": "2d5a5e680ff207ad97c7e7b7d999064b561dfd8a"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressMore.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
"line": 149, "line": 106,
"column": 17, "column": 17,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.", "message": "Unexpected mutation of \"entity\" prop.",
"hash": "e4c1ecd7ae77d46ac3625c5bbe92a24d6a964db9" "hash": "d52356f2af31d0167c02330ec22d09fbfa6b2b9f"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressMore.vue",
"line": 157,
"column": 17,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "4dece2db87c6ce1c04ae06c088ddfe916c1c0c61"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressMore.vue",
"line": 165,
"column": 17,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "facc7a0f17bdf19396fae3d0de3da82e60503c0d"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressMore.vue",
"line": 173,
"column": 17,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "19de32c76518387218264d7c4dab914d143a9cca"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
"line": 130, "line": 114,
"column": 17, "column": 17,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.", "message": "Unexpected mutation of \"entity\" prop.",
"hash": "239ac02a02694d5b20ab30d4c7ce5838c51d1515" "hash": "c8e8e06f370f93bf05867e93b5f037dfa46937b1"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
"line": 138, "line": 128,
"column": 17,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "a54f9bc6d1edfa4df93c7dd7d409cfef3fccf99e"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
"line": 152,
"column": 13, "column": 13,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.", "message": "Unexpected mutation of \"entity\" prop.",
"hash": "74a5f664d18f3916ea908897fcd0291cb0128f29" "hash": "9abaf71ca4b4f292b3b01e724d0a7733365e71f1"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
"line": 129,
"column": 13,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "0b0743959778a9e3d93089b132608816ee4e6646"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
"line": 132,
"column": 13,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "9759da7b7859b8ee8efaf74876430658ac6b6fe2"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
"line": 133,
"column": 13,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "dba8be9a27ab74ec743b7d9e07c05d857b407dd3"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
"line": 134,
"column": 13,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "9b1f5bce779aafc46b19d7a5d266eaa29f8f9be9"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
"line": 139,
"column": 13,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "fe6fc4aea0994ba9da15b7c09d308842b67958cb"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
"line": 153, "line": 153,
"column": 13, "column": 55,
"ruleId": "vue/no-mutating-props", "ruleId": "@typescript-eslint/no-unused-vars",
"message": "Unexpected mutation of \"entity\" prop.", "message": "'reject' is defined but never used.",
"hash": "740ea5d793c7a34c9f352d8b333f3aa04cc80ee8" "hash": "bd0e024fcad2e3f4566f15293e3c25c840f6dd3e"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
"line": 156, "line": 154,
"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, "column": 37,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.", "message": "Unexpected mutation of \"entity\" prop.",
"hash": "0ec402e43cb08bf129e0737c0d2c4f6d0c7af8bd" "hash": "596c4b180b926b7829f987384328bf5636cd367a"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
"line": 196, "line": 171,
"column": 59,
"ruleId": "@typescript-eslint/no-unused-vars",
"message": "'reject' is defined but never used.",
"hash": "5b41d5f9b45da074fb7bbbbd45e0da501da72071"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
"line": 172,
"column": 41, "column": 41,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.", "message": "Unexpected mutation of \"entity\" prop.",
"hash": "ec178d33e067aac892e015002afb6f3a2ff98762" "hash": "d92b92a25043244cca809bd129633b7e024e26b4"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
"line": 214, "line": 190,
"column": 17, "column": 17,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.", "message": "Unexpected mutation of \"entity\" prop.",
"hash": "c0f4e5454e672b6064eb9cf6c235c6810f7bfa80" "hash": "dd9a85ea740742d620e864796f67c5bff834486d"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
"line": 215, "line": 191,
"column": 17, "column": 17,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.", "message": "Unexpected mutation of \"entity\" prop.",
"hash": "e3dd840d2474f9865a45822872bf9ecfb15961d7" "hash": "e3e59960d0d50709a57b336f66b586710b774892"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
"line": 216, "line": 192,
"column": 17, "column": 17,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.", "message": "Unexpected mutation of \"entity\" prop.",
"hash": "a32a60382b145cc7a4a7ebe01ec435b8e3103320" "hash": "fe11b0e54396511e7b3b08615a78d22fc27e2fad"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/AddressSelection.vue",
"line": 246, "line": 222,
"column": 13, "column": 13,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.", "message": "Unexpected mutation of \"entity\" prop.",
"hash": "082447e5c731012f3acc282943502775dfd24797" "hash": "63c14c2150c33ec701bc4a0ff94efde69537d490"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
"line": 118, "line": 96,
"column": 20, "column": 20,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.", "message": "Unexpected mutation of \"entity\" prop.",
"hash": "d4fba4fe09af3c0937c0dd164928c8930c1591b5" "hash": "d2a9fdaeef0e2810f480022d4c6f99e4f76a818e"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
"line": 118, "line": 96,
"column": 20, "column": 20,
"ruleId": "vue/no-side-effects-in-computed-properties", "ruleId": "vue/no-side-effects-in-computed-properties",
"message": "Unexpected side effect in \"cities\" computed property.", "message": "Unexpected side effect in \"cities\" computed property.",
"hash": "1113a114d5aaf9f32f442916d25458541c5af35c" "hash": "dd92a60a9b1ebefeb9a90941d45326fbfa483733"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
"line": 102,
"column": 17,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "04be01ab638ce01f568fb0216929e65e1175ca23"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
"line": 110,
"column": 17,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "8619c8e0b63e87d09268832f90e4fba06b87e41f"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
"line": 124, "line": 124,
"column": 17, "column": 13,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.", "message": "Unexpected mutation of \"entity\" prop.",
"hash": "fa56a7c93583f0a9d0c2ecac10228c4f4fc1bc3a" "hash": "281f918da00635079501418b1e6b2c05b62eb4a7"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
"line": 132, "line": 125,
"column": 17, "column": 13,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.", "message": "Unexpected mutation of \"entity\" prop.",
"hash": "9fe87937ea67d1dae95fb3d44d4be0da2eba0905" "hash": "c131b09fa67ab1d069f1d04a54582d6b0f206153"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
"line": 126,
"column": 13,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "3d3a2a4add64c291b8f5f1cddd90a173cd6a819d"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
"line": 131,
"column": 21,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "ed48f4988914d7897018a2e06830a97e6740b3e8"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
"line": 145,
"column": 13,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "744f3a7610d4d6015e50e25149bceffd6c6e2763"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
@@ -1241,139 +1441,115 @@
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
"line": 148, "line": 149,
"column": 13, "column": 17,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.", "message": "Unexpected mutation of \"entity\" prop.",
"hash": "ab4f478fbfbc954b8dff75176dcd432f9ff28cfc" "hash": "1e7b1ad55866f708baaca72dfa4ff26d6f8e5d21"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
"line": 153, "line": 152,
"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, "column": 13,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.", "message": "Unexpected mutation of \"entity\" prop.",
"hash": "8aa37d2d4f011773e68838a2c88017875de563b5" "hash": "84779331536ffceec8d4a8c5ca4307310b882549"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
"line": 168, "line": 161,
"column": 13, "column": 13,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.", "message": "Unexpected mutation of \"entity\" prop.",
"hash": "a4827a357e52a51fa9262319114d81a130296acf" "hash": "0789999841be671a4d8ab080d6fdb679f843eb52"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
"line": 169, "line": 170,
"column": 13, "column": 51,
"ruleId": "vue/no-mutating-props", "ruleId": "@typescript-eslint/no-unused-vars",
"message": "Unexpected mutation of \"entity\" prop.", "message": "'reject' is defined but never used.",
"hash": "a4c9715664202949e3242b8d4aa4098288b46dc4" "hash": "bbb17afa114f016e2058d90aa32d2a625804f0d1"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
"line": 171, "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, "column": 33,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.", "message": "Unexpected mutation of \"entity\" prop.",
"hash": "5d1f97e4d7d9f47399d312e8b9f95ef9e3843b8c" "hash": "5fbe407ceceb37bff2ac800ceddd7942540132f1"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
"line": 190,
"column": 55,
"ruleId": "@typescript-eslint/no-unused-vars",
"message": "'reject' is defined but never used.",
"hash": "e2af91def877befbabef8e93deba4c58a3ee2ded"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
"line": 191,
"column": 37,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "ee8544ee45681a650ed7d4918ae979685cdd8f0f"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
"line": 210,
"column": 17,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "5d9d2217c8c7e6571bc9f72a98ea5b370edb4968"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
"line": 211,
"column": 17,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "6e04619b373c23c91f6c36c2aad314ac16cdb697"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
"line": 212,
"column": 17,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "39df045639a62f64ccdb03a80e286bc3ad772587"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
"line": 213, "line": 213,
"column": 37,
"ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.",
"hash": "c1df874f790ef0c036bf58ae8a8db1ee173685d4"
},
{
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
"line": 232,
"column": 17, "column": 17,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.", "message": "Unexpected mutation of \"entity\" prop.",
"hash": "476e6588a28ac9382e8b9d2e63a8babecd23bad8" "hash": "c399a43fa797a8ce61c9d96a644a39cc84a387b7"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CitySelection.vue",
"line": 233, "line": 245,
"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, "column": 13,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.", "message": "Unexpected mutation of \"entity\" prop.",
"hash": "2700f258396516a2fe971618fafbcdf72cdda3ab" "hash": "04337a07944caaa4819cfebcf29e1a7cbfdf248b"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CountrySelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CountrySelection.vue",
"line": 94, "line": 76,
"column": 13, "column": 13,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.", "message": "Unexpected mutation of \"entity\" prop.",
"hash": "4be1b0592efa775092a91a1d744e16ce98bd216e" "hash": "373a2e31f110d138c66d77f1faf5dc61545c55af"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CountrySelection.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/AddAddress/CountrySelection.vue",
"line": 99, "line": 81,
"column": 13, "column": 13,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.", "message": "Unexpected mutation of \"entity\" prop.",
"hash": "19b54b6d76c30249d520a296f826eda9d6eb0668" "hash": "421eb6a63224b4b1d81b216677a710c5c99ddee3"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/DatePane.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/DatePane.vue",
@@ -1393,19 +1569,19 @@
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/EditPane.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/EditPane.vue",
"line": 169, "line": 155,
"column": 17, "column": 17,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.", "message": "Unexpected mutation of \"entity\" prop.",
"hash": "dcb7b34098062760ddbb849655a5bb3ca65c36d3" "hash": "b3a822914fcb5e2fcf28efc331a45b9205002eeb"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/EditPane.vue", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/components/EditPane.vue",
"line": 178, "line": 164,
"column": 17, "column": 17,
"ruleId": "vue/no-mutating-props", "ruleId": "vue/no-mutating-props",
"message": "Unexpected mutation of \"entity\" prop.", "message": "Unexpected mutation of \"entity\" prop.",
"hash": "86b3ecf201025cac36878c5e4bf8850fb9d58cb5" "hash": "72c7d850f6cdeaf65b373a33234222f9766ee30b"
}, },
{ {
"path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/index.js", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/index.js",
@@ -1455,6 +1631,14 @@
"message": "'app' is assigned a value but never used.", "message": "'app' is assigned a value but never used.",
"hash": "9e6125f4fc387dc362c69cc6e3ce360eb2851f1b" "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", "path": "src/Bundle/ChillMainBundle/Resources/public/vuejs/_components/AddressDetails/Parts/AddressDetailsMap.vue",
"line": 24, "line": 24,
@@ -1543,6 +1727,14 @@
"message": "'tags' is assigned a value but never used.", "message": "'tags' is assigned a value but never used.",
"hash": "ae9bb2e0651c118ed9efd227e88b86cc83f5d80d" "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", "path": "src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/index.js",
"line": 19, "line": 19,
@@ -1575,6 +1767,14 @@
"message": "'app' is assigned a value but never used.", "message": "'app' is assigned a value but never used.",
"hash": "aaaaa63e7a60443b8cbf8191feb9142852ebdf1c" "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", "path": "src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/index.js",
"line": 12, "line": 12,
@@ -1615,6 +1815,22 @@
"message": "'evalFQDN' is assigned a value but never used.", "message": "'evalFQDN' is assigned a value but never used.",
"hash": "7fc32caafa23addddf44f3acbc5045b4523a0271" "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", "path": "src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/index.js",
"line": 16, "line": 16,
@@ -1631,6 +1847,38 @@
"message": "'app' is assigned a value but never used.", "message": "'app' is assigned a value but never used.",
"hash": "2f161e663689e3e4dfe2c53b0d64c91a4d2b1a60" "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", "path": "src/Bundle/ChillPersonBundle/Resources/public/vuejs/VisGraph/index.js",
"line": 20, "line": 20,
@@ -1639,6 +1887,22 @@
"message": "'app' is assigned a value but never used.", "message": "'app' is assigned a value but never used.",
"hash": "9e94e6412b8a44e47bfe8e66218cad09cff5bed4" "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", "path": "src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AddPersons/TypeUserGroup.vue",
"line": 6, "line": 6,
@@ -1654,5 +1918,45 @@
"ruleId": "@typescript-eslint/no-unused-vars", "ruleId": "@typescript-eslint/no-unused-vars",
"message": "'UserRenderBoxBadge' is defined but never used.", "message": "'UserRenderBoxBadge' is defined but never used.",
"hash": "99eba0d8633b2c9497417f4f61ec4194dbb2a96b" "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
View File

@@ -18,9 +18,6 @@ migrations/*
templates/* templates/*
translations/* translations/*
# we allow developers to add customization on their installation, without commiting it
config/packages/dev/*
###> symfony/framework-bundle ### ###> symfony/framework-bundle ###
/.env.local /.env.local
/.env.local.php /.env.local.php

View File

@@ -46,7 +46,7 @@ stages:
build: build:
stage: Composer install stage: Composer install
image: chill/base-image:8.3-edge image: gitea.champs-libres.be/chill-project/chill-skeleton-basic/base-image:php82
before_script: before_script:
- composer config -g cache-dir "$(pwd)/.cache" - composer config -g cache-dir "$(pwd)/.cache"
script: script:
@@ -61,7 +61,7 @@ build:
code_style: code_style:
stage: Tests stage: Tests
image: chill/base-image:8.3-edge image: gitea.champs-libres.be/chill-project/chill-skeleton-basic/base-image:php82
script: script:
- php-cs-fixer fix --dry-run -v --show-progress=none - php-cs-fixer fix --dry-run -v --show-progress=none
cache: cache:
@@ -74,7 +74,7 @@ code_style:
phpstan_tests: phpstan_tests:
stage: Tests stage: Tests
image: chill/base-image:8.3-edge image: gitea.champs-libres.be/chill-project/chill-skeleton-basic/base-image:php82
variables: variables:
COMPOSER_MEMORY_LIMIT: 3G COMPOSER_MEMORY_LIMIT: 3G
before_script: before_script:
@@ -91,7 +91,7 @@ phpstan_tests:
rector_tests: rector_tests:
stage: Tests stage: Tests
image: chill/base-image:8.3-edge image: gitea.champs-libres.be/chill-project/chill-skeleton-basic/base-image:php82
before_script: before_script:
- bin/console cache:clear --env=dev - bin/console cache:clear --env=dev
script: script:
@@ -132,7 +132,7 @@ lint:
unit_tests: unit_tests:
stage: Tests stage: Tests
image: chill/base-image:8.3-edge image: gitea.champs-libres.be/chill-project/chill-skeleton-basic/base-image:php82
variables: variables:
COMPOSER_MEMORY_LIMIT: 3G COMPOSER_MEMORY_LIMIT: 3G
before_script: before_script:

View File

@@ -22,7 +22,7 @@ Chill is a comprehensive web application built as a set of Symfony bundles. It i
- **Backend**: PHP 8.3+, Symfony 5.4 - **Backend**: PHP 8.3+, Symfony 5.4
- **Frontend**: JavaScript/TypeScript, Vue.js 3, Bootstrap 5 - **Frontend**: JavaScript/TypeScript, Vue.js 3, Bootstrap 5
- **Build Tools**: Webpack Encore, Yarn - **Build Tools**: Webpack Encore, Yarn
- **Database**: PostgreSQL with materialized views. We do not support other databases. - **Database**: PostgreSQL with materialized views
- **Other Services**: Redis, AMQP (RabbitMQ), SMTP - **Other Services**: Redis, AMQP (RabbitMQ), SMTP
## Project Structure ## Project Structure
@@ -149,93 +149,14 @@ Key configuration files:
- `package.json`: JavaScript dependencies and scripts - `package.json`: JavaScript dependencies and scripts
- `.env`: Default environment variables. Must usually not be updated: use `.env.local` instead. - `.env`: Default environment variables. Must usually not be updated: use `.env.local` instead.
### Database migrations
Each time a doctrine entity is created, we generate migration to adapt the database.
The migration 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).
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):
- `Chill\Bundle\ActivityBundle` writes migrations to `Chill\Migrations\Activity`;
- `Chill\Bundle\BudgetBundle` writes migrations to `Chill\Migrations\Budget`;
- `Chill\Bundle\CustomFieldsBundle` writes migrations to `Chill\Migrations\CustomFields`;
- `Chill\Bundle\DocGeneratorBundle` writes migrations to `Chill\Migrations\DocGenerator`;
- `Chill\Bundle\DocStoreBundle` writes migrations to `Chill\Migrations\DocStore`;
- `Chill\Bundle\EventBundle` writes migrations to `Chill\Migrations\Event`;
- `Chill\Bundle\CalendarBundle` writes migrations to `Chill\Migrations\Calendar`;
- `Chill\Bundle\FamilyMembersBundle` writes migrations to `Chill\Migrations\FamilyMembers`;
- `Chill\Bundle\FranceTravailApiBundle` writes migrations to `Chill\Migrations\FranceTravailApi`;
- `Chill\Bundle\JobBundle` writes migrations to `Chill\Migrations\Job`;
- `Chill\Bundle\MainBundle` writes migrations to `Chill\Migrations\Main`;
- `Chill\Bundle\PersonBundle` writes migrations to `Chill\Migrations\Person`;
- `Chill\Bundle\ReportBundle` writes migrations to `Chill\Migrations\Report`;
- `Chill\Bundle\TaskBundle` writes migrations to `Chill\Migrations\Task`;
- `Chill\Bundle\ThirdPartyBundle` writes migrations to `Chill\Migrations\ThirdParty`;
- `Chill\Bundle\TicketBundle` writes migrations to `Chill\Migrations\Ticket`;
- `Chill\Bundle\WopiBundle` writes migrations to `Chill\Migrations\Wopi`;
Once created the, comment's classes should be removed and a description of the changes made to the entities should be added to the migrations, using the `getDescription` method. The migration should not be cleaned by any artificial intelligence, as modifying this migration is error prone.
### Guidelines related to code structure and requirements
#### Usage of clock
When we need to use a DateTime or DateTimeImmutable that need to express "now", we prefer the usage of
`Symfony\Component\Clock\ClockInterface`, where possible. This is usually not possible in doctrine entities,
where injection does not work when restoring an entity from 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 ### 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. 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). For creating mock, we prefer using prophecy (library phpspec/prophecy).
##### Useful helpers and tips that avoid create a mock
Some notable implementations that are tests helper, and avoid to create 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 #### Running Tests
The tests are run from the project's root (not from the bundle's root).
```bash ```bash
# Run all tests # Run all tests
vendor/bin/phpunit vendor/bin/phpunit
@@ -297,7 +218,7 @@ class TicketTest extends TestCase
#### Test Database #### 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 an in-memory SQLite database by default. You can configure a different database for testing in the `.env.test` file.
### Code Quality Tools ### Code Quality Tools

View File

@@ -6,169 +6,6 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
and is generated by [Changie](https://github.com/miniscruff/changie). 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.
* Add desactivation date for social action and issue csv export
* Add Emoji and Fullscreen feature to ckeditor configuration
* ([#321](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/321)) Create editor which allow us to toggle between rich and simple text editor
* Do not remove workflow which are automatically canceled after staling for more than 30 days
### Fixed
* ([#376](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/376)) trying to prevent bug of typeerror in doc-history + improved display of document history
* ([#381](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/381)) Display previous participation in acc course work even if the person has left the acc course
* ([#372](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/372)) Fix display of text in calendar events
* Add missing translation for user_group.no_user_groups
* Fix admin entity edit actions for event admin entities and activity reason (category) entities
* ([#392](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/392)) Allow null and cast as string to setContent method for NewsItem
* ([#393](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/393)) Doc Generation: the "dump only" method send the document as an email attachment.
### DX
* ([#352](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/352)) Remove dead code for wopi-link module
* Replace library node-sass by sass, and upgrade bootstrap to version 5.3 (yarn upgrade / install is required)
### UX
* ([#374](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/374)) Remove default filter in_progress for the page 'my tasks'; Allows for new tasks to be displayed upon opening of the page
* Improve labeling of fields in person resource creation form
## v3.11.0 - 2025-04-17
### Feature
* ([#365](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/365)) Add counters of actions and activities, with 2 boxes to (1) show the number of active actions on total actions and (2) show the number of activities in a accompanying period, and pills in menus for showing the number of active actions and the number of activities.
* ([#364](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/364)) Added a second phone number "telephone2" to the thirdParty entity. Adapted twig templates and vuejs apps to handle this phone number
**Schema Change**: Add columns or tables
* Signature: add a button to go directly to the signature zone, even if there is only one
### Fixed
* Fixed wrong translations in the on-the-fly for creation of thirdParty
* Fixed update of phone number in on-the-fly edition of thirdParty
* Fixed closing of modal when editing thirdParty in accompanying course works
* Shorten the delay between two execution of AccompanyingPeriodStepChangeCronjob, to ensure at least one execution in a day
* ([#102](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/102)) Fix display of title in document list
* When cleaning the old stored object versions, do not throw an error if the stored object is not found on disk
* Add consistent log prefix and key to logs when stale workflows are automatically canceled
* ([#380](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/380)) Remove the "not null" validation constraint on recently added properties on HouseholdComposition
### DX
* Add new chill-col style for displaying title and aside in a flex table
## v3.10.3 - 2025-03-18 ## v3.10.3 - 2025-03-18
### DX ### DX
* Eslint fixes * Eslint fixes

View File

@@ -17,7 +17,6 @@ chill_main:
acl: acl:
form_show_scopes: true form_show_scopes: true
form_show_centers: true form_show_centers: true
filter_stats_by_center: true
access_global_history: false access_global_history: false
access_user_change_password: true access_user_change_password: true
access_permissions_group_list: true access_permissions_group_list: true

View File

@@ -5,6 +5,7 @@ framework:
# Uncomment this (and the failed transport below) to send failed messages to this transport for later handling. # Uncomment this (and the failed transport below) to send failed messages to this transport for later handling.
failure_transport: failed failure_transport: failed
transports: transports:
# those transports are added by chill-bundles recipes # those transports are added by chill-bundles recipes
sync: sync:// sync: sync://
@@ -18,9 +19,7 @@ framework:
async: ~ async: ~
auto_setup: true auto_setup: true
priority: priority: '%env(MESSENGER_TRANSPORT_DSN)%/priority'
dsn: '%env(MESSENGER_TRANSPORT_DSN)%/priority'
# end of transports added by chill-bundles recipes # end of transports added by chill-bundles recipes
# https://symfony.com/doc/current/messenger.html#transport-configuration # https://symfony.com/doc/current/messenger.html#transport-configuration
failed: 'doctrine://default?queue_name=failed' failed: 'doctrine://default?queue_name=failed'
@@ -62,10 +61,6 @@ framework:
'Chill\MainBundle\Workflow\Messenger\PostSignatureStateChangeMessage': priority 'Chill\MainBundle\Workflow\Messenger\PostSignatureStateChangeMessage': priority
'Chill\MainBundle\Workflow\Messenger\PostPublicViewMessage': async 'Chill\MainBundle\Workflow\Messenger\PostPublicViewMessage': async
'Chill\MainBundle\Service\Workflow\CancelStaleWorkflowMessage': 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 # end of routes added by chill-bundles recipes
# Route your messages to the transports # Route your messages to the transports
# 'App\Message\YourMessage': async # 'App\Message\YourMessage': async

View File

@@ -12,7 +12,6 @@ declare(strict_types=1);
namespace Chill\PersonBundle\Export\Filter; namespace Chill\PersonBundle\Export\Filter;
use Chill\MainBundle\Export\ExportElementValidatedInterface; use Chill\MainBundle\Export\ExportElementValidatedInterface;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use DateTime; use DateTime;
use Doctrine\ORM\Query\Expr; use Doctrine\ORM\Query\Expr;
@@ -21,7 +20,6 @@ use Symfony\Component\Validator\Context\ExecutionContextInterface;
class BirthdateFilter implements ExportElementValidatedInterface, FilterInterface class BirthdateFilter implements ExportElementValidatedInterface, FilterInterface
{ {
use \Chill\MainBundle\Export\ExportDataNormalizerTrait;
// add specific role for this filter // add specific role for this filter
public function addRole(): ?string public function addRole(): ?string
{ {
@@ -30,7 +28,7 @@ class BirthdateFilter implements ExportElementValidatedInterface, FilterInterfac
} }
// here, we alter the query created by Export // here, we alter the query created by Export
public function alterQuery(\Doctrine\ORM\QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(\Doctrine\ORM\QueryBuilder $qb, $data)
{ {
$where = $qb->getDQLPart('where'); $where = $qb->getDQLPart('where');
// we create the clause here // we create the clause here
@@ -54,13 +52,13 @@ class BirthdateFilter implements ExportElementValidatedInterface, FilterInterfac
} }
// we give information on which type of export this filter applies // we give information on which type of export this filter applies
public function applyOn(): string public function applyOn()
{ {
return 'person'; return 'person';
} }
// we build a form to collect some parameters from the users // we build a form to collect some parameters from the users
public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder): void public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder)
{ {
$builder->add('date_from', DateType::class, [ $builder->add('date_from', DateType::class, [
'label' => 'Born after this date', 'label' => 'Born after this date',
@@ -76,18 +74,6 @@ class BirthdateFilter implements ExportElementValidatedInterface, FilterInterfac
'format' => 'dd-MM-yyyy', '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 public function getFormDefaultData(): array
{ {
return ['date_from' => new DateTime(), 'date_to' => new DateTime()]; return ['date_from' => new DateTime(), 'date_to' => new DateTime()];
@@ -95,7 +81,7 @@ class BirthdateFilter implements ExportElementValidatedInterface, FilterInterfac
// here, we create a simple string which will describe the action of // here, we create a simple string which will describe the action of
// the filter in the Response // the filter in the Response
public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array public function describeAction($data, $format = 'string')
{ {
return ['Filtered by person\'s birtdate: ' return ['Filtered by person\'s birtdate: '
. 'between %date_from% and %date_to%', [ . 'between %date_from% and %date_to%', [
@@ -104,7 +90,7 @@ class BirthdateFilter implements ExportElementValidatedInterface, FilterInterfac
], ]; ], ];
} }
public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface public function getTitle()
{ {
return 'Filter by person\'s birthdate'; return 'Filter by person\'s birthdate';
} }
@@ -113,7 +99,7 @@ class BirthdateFilter implements ExportElementValidatedInterface, FilterInterfac
// is executed here. This function is added by the interface // is executed here. This function is added by the interface
// `ExportElementValidatedInterface`, and can be ignore if there is // `ExportElementValidatedInterface`, and can be ignore if there is
// no need for a validation // no need for a validation
public function validateForm($data, ExecutionContextInterface $context): void public function validateForm($data, ExecutionContextInterface $context)
{ {
$date_from = $data['date_from']; $date_from = $data['date_from'];
$date_to = $data['date_to']; $date_to = $data['date_to'];

View File

@@ -36,18 +36,6 @@ class CountPerson implements ExportInterface
{ {
// this export does not add any form // 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 public function getFormDefaultData(): array
{ {
return []; return [];
@@ -72,29 +60,29 @@ class CountPerson implements ExportInterface
}; };
} }
public function getQueryKeys($data): array public function getQueryKeys($data)
{ {
// this array match the result keys in the query. We have only // this array match the result keys in the query. We have only
// one column. // one column.
return ['export_result']; return ['export_result'];
} }
public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array public function getResult($query, $data)
{ {
return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); return $query->getQuery()->getResult(Query::HYDRATE_SCALAR);
} }
public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface public function getTitle()
{ {
return 'Count peoples'; return 'Count peoples';
} }
public function getType(): string public function getType()
{ {
return Declarations::PERSON_TYPE; return Declarations::PERSON_TYPE;
} }
public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
{ {
// we gather all center the user choose. // we gather all center the user choose.
$centers = array_map(static fn ($el) => $el['center'], $acl); $centers = array_map(static fn ($el) => $el['center'], $acl);

View File

@@ -1,84 +0,0 @@
@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

View File

@@ -15,31 +15,24 @@ Messages to users, flashbags and buttons
Flashbags Flashbags
========== ==========
The four following levels are defined : The four following levels are defined :
+-----------+----------------------------------------------------------------------------------------------+ +-----------+----------------------------------------------------------------------------------------------+
|Key |Intent | |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. | |success |The user action succeeds. |
+-----------+----------------------------------------------------------------------------------------------+ +-----------+----------------------------------------------------------------------------------------------+
|notice |A simple message to give information to the user. The message may be linked or not linked with| |notice |A simple message to give information to the user. The message may be linked or not linked with|
| |the user action. | | |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. | |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:: .. seealso::
`Flash Messages on Symfony documentation <http://symfony.com/doc/current/book/controller.html#flash-messages>`_ `Flash Messages on Symfony documentation <http://symfony.com/doc/current/book/controller.html#flash-messages>`_
@@ -73,7 +66,7 @@ To add the action on button, use them as class along with ``sc-button`` :
| | | - Submitting this form will remove the entity | | | | - Submitting this form will remove the entity |
+-----------+----------------+------------------------------------------------------------------------------+ +-----------+----------------+------------------------------------------------------------------------------+
| Edit | ``bt-edit`` or | Link to a form to edit an 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 | | Save | ``bt-save`` | Submitting this form will save change on the entity |
+-----------+----------------+------------------------------------------------------------------------------+ +-----------+----------------+------------------------------------------------------------------------------+

View File

@@ -1,90 +1,90 @@
{ {
"name": "chill", "name": "chill",
"version": "2.0.0", "version": "2.0.0",
"devDependencies": { "devDependencies": {
"@alexlafroscia/yaml-merge": "^4.0.0", "@alexlafroscia/yaml-merge": "^4.0.0",
"@apidevtools/swagger-cli": "^4.0.4", "@apidevtools/swagger-cli": "^4.0.4",
"@babel/core": "^7.20.5", "@babel/core": "^7.20.5",
"@babel/preset-env": "^7.20.2", "@babel/preset-env": "^7.20.2",
"@ckeditor/ckeditor5-vue": "^7.3.0", "@ckeditor/ckeditor5-vue": "^7.3.0",
"@eslint/js": "^9.14.0", "@eslint/js": "^9.14.0",
"@hotwired/stimulus": "^3.0.0", "@hotwired/stimulus": "^3.0.0",
"@luminateone/eslint-baseline": "^1.0.9", "@luminateone/eslint-baseline": "^1.0.9",
"@symfony/stimulus-bridge": "^3.2.0", "@symfony/stimulus-bridge": "^3.2.0",
"@symfony/webpack-encore": "^4.1.0", "@symfony/webpack-encore": "^4.1.0",
"@tsconfig/node20": "^20.1.4", "@tsconfig/node20": "^20.1.4",
"@types/dompurify": "^3.0.5", "@types/dompurify": "^3.0.5",
"@types/eslint__js": "^8.42.3", "@types/eslint__js": "^8.42.3",
"@typescript-eslint/parser": "^8.12.2", "@typescript-eslint/parser": "^8.12.2",
"bindings": "^1.5.0", "bindings": "^1.5.0",
"bootstrap": "^5.3.6", "bootstrap": "^5.3.6",
"chokidar": "^3.5.1", "chokidar": "^3.5.1",
"ckeditor5": "^45.1.0", "ckeditor5": "^45.1.0",
"dompurify": "^3.1.0", "dompurify": "^3.1.0",
"eslint": "^9.14.0", "eslint": "^9.14.0",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.2.1", "eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-vue": "^9.30.0", "eslint-plugin-vue": "^9.30.0",
"fork-awesome": "^1.1.7", "fork-awesome": "^1.1.7",
"intl-messageformat": "^10.5.11", "intl-messageformat": "^10.5.11",
"jquery": "^3.6.0", "jquery": "^3.6.0",
"popper.js": "^1.16.1", "popper.js": "^1.16.1",
"postcss-loader": "^7.0.2", "postcss-loader": "^7.0.2",
"prettier": "^3.3.3", "prettier": "^3.3.3",
"raw-loader": "^4.0.2", "raw-loader": "^4.0.2",
"sass": "^1.89.0", "sass": "^1.89.0",
"sass-loader": "^14.0.0", "sass-loader": "^14.0.0",
"select2": "^4.0.13", "select2": "^4.0.13",
"select2-bootstrap-theme": "0.1.0-beta.10", "select2-bootstrap-theme": "0.1.0-beta.10",
"style-loader": "^3.3.1", "style-loader": "^3.3.1",
"ts-loader": "^9.3.1", "ts-loader": "^9.3.1",
"typescript": "^5.6.3", "typescript": "^5.6.3",
"typescript-eslint": "^8.13.0", "typescript-eslint": "^8.13.0",
"vue-loader": "^17.0.0", "vue-loader": "^17.0.0",
"webpack": "^5.75.0", "webpack": "^5.75.0",
"webpack-cli": "^5.0.1" "webpack-cli": "^5.0.1"
}, },
"dependencies": { "dependencies": {
"@fullcalendar/core": "^6.1.4", "@fullcalendar/core": "^6.1.4",
"@fullcalendar/daygrid": "^6.1.4", "@fullcalendar/daygrid": "^6.1.4",
"@fullcalendar/interaction": "^6.1.4", "@fullcalendar/interaction": "^6.1.4",
"@fullcalendar/list": "^6.1.4", "@fullcalendar/list": "^6.1.4",
"@fullcalendar/timegrid": "^6.1.4", "@fullcalendar/timegrid": "^6.1.4",
"@fullcalendar/vue3": "^6.1.4", "@fullcalendar/vue3": "^6.1.4",
"@popperjs/core": "^2.9.2", "@popperjs/core": "^2.9.2",
"@tsconfig/node20": "^20.1.4", "@tsconfig/node20": "^20.1.4",
"@types/dompurify": "^3.0.5", "@types/dompurify": "^3.0.5",
"@types/leaflet": "^1.9.3", "@types/leaflet": "^1.9.3",
"bootstrap-icons": "^1.11.3", "bootstrap-icons": "^1.11.3",
"dropzone": "^5.7.6", "dropzone": "^5.7.6",
"es6-promise": "^4.2.8", "es6-promise": "^4.2.8",
"intl-messageformat": "^10.5.11", "intl-messageformat": "^10.5.11",
"leaflet": "^1.7.1", "leaflet": "^1.7.1",
"marked": "^12.0.2", "marked": "^12.0.2",
"masonry-layout": "^4.2.2", "masonry-layout": "^4.2.2",
"mime": "^4.0.0", "mime": "^4.0.0",
"pdfjs-dist": "^4.3.136", "pdfjs-dist": "^4.3.136",
"vis-network": "^9.1.0", "vis-network": "^9.1.0",
"vue": "^3.5.6", "vue": "^3.5.6",
"vue-i18n": "^9.1.6", "vue-i18n": "^9.1.6",
"vue-multiselect": "3.0.0-alpha.2", "vue-multiselect": "3.0.0-alpha.2",
"vue-toast-notification": "^3.1.2", "vue-toast-notification": "^3.1.2",
"vuex": "^4.0.0" "vuex": "^4.0.0"
}, },
"browserslist": [ "browserslist": [
"defaults and fully supports es6-module and not dead" "defaults and fully supports es6-module and not dead"
], ],
"scripts": { "scripts": {
"dev-server": "encore dev-server", "dev-server": "encore dev-server",
"dev": "encore dev", "dev": "encore dev",
"watch": "encore dev --watch", "watch": "encore dev --watch",
"build": "encore production --progress", "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> templates/api/specs.yaml",
"specs-validate": "swagger-cli validate templates/api/specs.yaml", "specs-validate": "swagger-cli validate templates/api/specs.yaml",
"specs-create-dir": "mkdir -p templates/api", "specs-create-dir": "mkdir -p templates/api",
"specs": "yarn run specs-create-dir && yarn run specs-build && yarn run specs-validate", "specs": "yarn run specs-create-dir && yarn run specs-build && yarn run specs-validate",
"version": "node --version", "version": "node --version",
"eslint": "npx eslint-baseline --fix \"src/**/*.{js,ts,vue}\"" "eslint": "npx eslint-baseline --fix \"src/**/*.{js,ts,vue}\""
}, },
"private": true "private": true
} }

View File

@@ -2154,6 +2154,11 @@ parameters:
count: 1 count: 1
path: src/Bundle/ChillMainBundle/Export/Formatter/SpreadSheetFormatter.php 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\\.$#" message: "#^PHPDoc tag @var for property Chill\\\\MainBundle\\\\Export\\\\Helper\\\\ExportAddressHelper\\:\\:\\$unitNamesKeysCache contains unresolvable type\\.$#"
count: 1 count: 1

View File

@@ -3,7 +3,7 @@ parameters:
paths: paths:
- src/ - src/
- utils/ - utils/
tmpDir: var/cache/phpstan tmpDir: .cache/
reportUnmatchedIgnoredErrors: false reportUnmatchedIgnoredErrors: false
excludePaths: excludePaths:
- .php_cs* - .php_cs*

View File

@@ -1,24 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <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">
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd" <testsuites>
bootstrap="vendor/autoload.php" <testsuite name="default">
executionOrder="depends,defects" <directory>utils/rector/tests</directory>
beStrictAboutOutputDuringTests="true" </testsuite>
failOnRisky="true" </testsuites>
failOnWarning="true" <source>
colors="true" <include>
cacheDirectory="var/cache/phpunit.rector.cache" <directory suffix=".php">utils/rector/src</directory>
requireCoverageMetadata="true" </include>
beStrictAboutCoverageMetadata="true" </source>
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> </phpunit>

View File

@@ -18,15 +18,14 @@ return static function (RectorConfig $rectorConfig): void {
$rectorConfig->paths([ $rectorConfig->paths([
__DIR__ . '/docs', __DIR__ . '/docs',
__DIR__ . '/src', __DIR__ . '/src',
__DIR__ . '/rector.php',
]); ]);
$rectorConfig->skip([ $rectorConfig->skip([
\Rector\Php55\Rector\String_\StringClassNameToClassConstantRector::class => __DIR__ . 'src/Bundle/ChillMainBundle/Service/Notifier/LegacyOvhCloudFactory.php' \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->symfonyContainerXml(__DIR__ . '/var/cache/dev/test/App_KernelTestDebugContainer.xml ');
//$rectorConfig->symfonyContainerPhp(__DIR__ . '/tests/symfony-container.php'); $rectorConfig->symfonyContainerPhp(__DIR__ . '/tests/symfony-container.php');
//$rectorConfig->cacheClass(\Rector\Caching\ValueObject\Storage\FileCacheStorage::class); //$rectorConfig->cacheClass(\Rector\Caching\ValueObject\Storage\FileCacheStorage::class);
//$rectorConfig->cacheDirectory(__DIR__ . '/.cache/rector'); //$rectorConfig->cacheDirectory(__DIR__ . '/.cache/rector');
@@ -40,11 +39,16 @@ return static function (RectorConfig $rectorConfig): void {
// part of the symfony 54 rules // part of the symfony 54 rules
$rectorConfig->rule(\Rector\Symfony\Symfony53\Rector\StaticPropertyFetch\KernelTestCaseContainerPropertyDeprecationRector::class); $rectorConfig->rule(\Rector\Symfony\Symfony53\Rector\StaticPropertyFetch\KernelTestCaseContainerPropertyDeprecationRector::class);
$rectorConfig->rule(\Rector\Symfony\Symfony60\Rector\MethodCall\GetHelperControllerToServiceRector::class); $rectorConfig->rule(\Rector\Symfony\Symfony60\Rector\MethodCall\GetHelperControllerToServiceRector::class);
//$rectorConfig->disableParallel(); $rectorConfig->disableParallel();
//define sets of rules //define sets of rules
$rectorConfig->sets([ $rectorConfig->sets([
LevelSetList::UP_TO_PHP_82, 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\Doctrine\Set\DoctrineSetList::DOCTRINE_CODE_QUALITY,
\Rector\PHPUnit\Set\PHPUnitSetList::PHPUNIT_90, \Rector\PHPUnit\Set\PHPUnitSetList::PHPUNIT_90,
]); ]);
@@ -62,6 +66,11 @@ return static function (RectorConfig $rectorConfig): void {
// some routes are added twice if it remains activated // some routes are added twice if it remains activated
// $rectorConfig->rule(\Rector\Symfony\Configs\Rector\ClassMethod\AddRouteAnnotationRector::class); // $rectorConfig->rule(\Rector\Symfony\Configs\Rector\ClassMethod\AddRouteAnnotationRector::class);
// chill rules
$rectorConfig->rules([
\Chill\Utils\Rector\Rector\ChillBundleMakeDataProviderStaticForAbstractExportTestRector::class,
]);
// skip some path... // skip some path...
$rectorConfig->skip([ $rectorConfig->skip([
// waiting for fixing this bug: https://github.com/rectorphp/rector-doctrine/issues/342 // waiting for fixing this bug: https://github.com/rectorphp/rector-doctrine/issues/342
@@ -85,6 +94,4 @@ return static function (RectorConfig $rectorConfig): void {
new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\MainBundle\Validator\Constraints\Entity\UserCircleConsistency'), new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\MainBundle\Validator\Constraints\Entity\UserCircleConsistency'),
new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\MainBundle\Workflow\Validator\EntityWorkflowCreation'), new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\MainBundle\Workflow\Validator\EntityWorkflowCreation'),
]); ]);
}; };

View File

@@ -48,6 +48,28 @@ class ActivityReasonCategoryController extends AbstractController
]); ]);
} }
/**
* Displays a form to edit an existing ActivityReasonCategory entity.
*/
#[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreasoncategory/{id}/edit', name: 'chill_activity_activityreasoncategory_edit')]
public function editAction(mixed $id)
{
$em = $this->managerRegistry->getManager();
$entity = $em->getRepository(ActivityReasonCategory::class)->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find ActivityReasonCategory entity.');
}
$editForm = $this->createEditForm($entity);
return $this->render('@ChillActivity/ActivityReasonCategory/edit.html.twig', [
'entity' => $entity,
'edit_form' => $editForm->createView(),
]);
}
/** /**
* Lists all ActivityReasonCategory entities. * Lists all ActivityReasonCategory entities.
*/ */
@@ -78,10 +100,29 @@ class ActivityReasonCategoryController extends AbstractController
]); ]);
} }
/**
* Finds and displays a ActivityReasonCategory entity.
*/
#[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreasoncategory/{id}/show', name: 'chill_activity_activityreasoncategory_show')]
public function showAction(mixed $id)
{
$em = $this->managerRegistry->getManager();
$entity = $em->getRepository(ActivityReasonCategory::class)->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find ActivityReasonCategory entity.');
}
return $this->render('@ChillActivity/ActivityReasonCategory/show.html.twig', [
'entity' => $entity,
]);
}
/** /**
* Edits an existing ActivityReasonCategory entity. * Edits an existing ActivityReasonCategory entity.
*/ */
#[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreasoncategory/{id}/update', name: 'chill_activity_activityreasoncategory_update')] #[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreasoncategory/{id}/update', name: 'chill_activity_activityreasoncategory_update', methods: ['POST', 'PUT'])]
public function updateAction(Request $request, mixed $id) public function updateAction(Request $request, mixed $id)
{ {
$em = $this->managerRegistry->getManager(); $em = $this->managerRegistry->getManager();
@@ -98,7 +139,7 @@ class ActivityReasonCategoryController extends AbstractController
if ($editForm->isSubmitted() && $editForm->isValid()) { if ($editForm->isSubmitted() && $editForm->isValid()) {
$em->flush(); $em->flush();
return $this->redirectToRoute('chill_activity_activityreasoncategory', ['id' => $id]); return $this->redirectToRoute('chill_activity_activityreasoncategory_edit', ['id' => $id]);
} }
return $this->render('@ChillActivity/ActivityReasonCategory/edit.html.twig', [ return $this->render('@ChillActivity/ActivityReasonCategory/edit.html.twig', [
@@ -137,7 +178,7 @@ class ActivityReasonCategoryController extends AbstractController
{ {
$form = $this->createForm(ActivityReasonCategoryType::class, $entity, [ $form = $this->createForm(ActivityReasonCategoryType::class, $entity, [
'action' => $this->generateUrl('chill_activity_activityreasoncategory_update', ['id' => $entity->getId()]), 'action' => $this->generateUrl('chill_activity_activityreasoncategory_update', ['id' => $entity->getId()]),
'method' => 'POST', 'method' => 'PUT',
]); ]);
$form->add('submit', SubmitType::class, ['label' => 'Update']); $form->add('submit', SubmitType::class, ['label' => 'Update']);

View File

@@ -17,6 +17,7 @@ use Chill\ActivityBundle\Repository\ActivityReasonRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
/** /**
* ActivityReason controller. * ActivityReason controller.
@@ -49,6 +50,28 @@ class ActivityReasonController extends AbstractController
]); ]);
} }
/**
* Displays a form to edit an existing ActivityReason entity.
*/
#[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreason/{id}/edit', name: 'chill_activity_activityreason_edit')]
public function editAction(mixed $id)
{
$em = $this->managerRegistry->getManager();
$entity = $em->getRepository(ActivityReason::class)->find($id);
if (null === $entity) {
throw new NotFoundHttpException('Unable to find ActivityReason entity.');
}
$editForm = $this->createEditForm($entity);
return $this->render('@ChillActivity/ActivityReason/edit.html.twig', [
'entity' => $entity,
'edit_form' => $editForm->createView(),
]);
}
/** /**
* Lists all ActivityReason entities. * Lists all ActivityReason entities.
*/ */
@@ -79,10 +102,29 @@ class ActivityReasonController extends AbstractController
]); ]);
} }
/**
* Finds and displays a ActivityReason entity.
*/
#[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreason/{id}/show', name: 'chill_activity_activityreason_show')]
public function showAction(mixed $id)
{
$em = $this->managerRegistry->getManager();
$entity = $em->getRepository(ActivityReason::class)->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find ActivityReason entity.');
}
return $this->render('@ChillActivity/ActivityReason/show.html.twig', [
'entity' => $entity,
]);
}
/** /**
* Edits an existing ActivityReason entity. * Edits an existing ActivityReason entity.
*/ */
#[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreason/{id}/update', name: 'chill_activity_activityreason_update')] #[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreason/{id}/update', name: 'chill_activity_activityreason_update', methods: ['POST', 'PUT'])]
public function updateAction(Request $request, mixed $id) public function updateAction(Request $request, mixed $id)
{ {
$em = $this->managerRegistry->getManager(); $em = $this->managerRegistry->getManager();
@@ -138,7 +180,7 @@ class ActivityReasonController extends AbstractController
{ {
$form = $this->createForm(ActivityReasonType::class, $entity, [ $form = $this->createForm(ActivityReasonType::class, $entity, [
'action' => $this->generateUrl('chill_activity_activityreason_update', ['id' => $entity->getId()]), 'action' => $this->generateUrl('chill_activity_activityreason_update', ['id' => $entity->getId()]),
'method' => 'POST', 'method' => 'PUT',
]); ]);
$form->add('submit', SubmitType::class, ['label' => 'Update']); $form->add('submit', SubmitType::class, ['label' => 'Update']);

View File

@@ -24,7 +24,7 @@ class ByActivityNumberAggregator implements AggregatorInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data): void
{ {
$qb $qb
->addSelect('(SELECT COUNT(activity.id) FROM '.Activity::class.' activity WHERE activity.accompanyingPeriod = acp) AS activity_by_number_aggregator') ->addSelect('(SELECT COUNT(activity.id) FROM '.Activity::class.' activity WHERE activity.accompanyingPeriod = acp) AS activity_by_number_aggregator')
@@ -41,27 +41,12 @@ class ByActivityNumberAggregator implements AggregatorInterface
// No form needed // 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function getLabels($key, array $values, $data): callable public function getLabels($key, array $values, $data)
{ {
return static function ($value) { return static function ($value) {
if ('_header' === $value) { if ('_header' === $value) {

View File

@@ -33,7 +33,7 @@ final readonly class ByActivityTypeAggregator implements AggregatorInterface
private TranslatableStringHelperInterface $translatableStringHelper, private TranslatableStringHelperInterface $translatableStringHelper,
) {} ) {}
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder $builder
->add('after_date', PickRollingDateType::class, [ ->add('after_date', PickRollingDateType::class, [
@@ -46,21 +46,6 @@ 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 public function getFormDefaultData(): array
{ {
return [ return [
@@ -69,7 +54,7 @@ final readonly class ByActivityTypeAggregator implements AggregatorInterface
]; ];
} }
public function getLabels($key, array $values, mixed $data): callable public function getLabels($key, array $values, mixed $data)
{ {
return function (int|string|null $value): string { return function (int|string|null $value): string {
if ('_header' === $value) { if ('_header' === $value) {
@@ -84,12 +69,12 @@ final readonly class ByActivityTypeAggregator implements AggregatorInterface
}; };
} }
public function getQueryKeys($data): array public function getQueryKeys($data)
{ {
return [self::PREFIX.'_actype_id']; return [self::PREFIX.'_actype_id'];
} }
public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface public function getTitle()
{ {
return 'export.aggregator.acp.by_activity_type.title'; return 'export.aggregator.acp.by_activity_type.title';
} }
@@ -99,7 +84,7 @@ final readonly class ByActivityTypeAggregator implements AggregatorInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$p = self::PREFIX; $p = self::PREFIX;
@@ -130,7 +115,7 @@ final readonly class ByActivityTypeAggregator implements AggregatorInterface
->addGroupBy("{$p}_actype_id"); ->addGroupBy("{$p}_actype_id");
} }
public function applyOn(): string public function applyOn()
{ {
return Declarations::ACP_TYPE; return Declarations::ACP_TYPE;
} }

View File

@@ -27,7 +27,7 @@ class BySocialActionAggregator implements AggregatorInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
if (!\in_array('actsocialaction', $qb->getAllAliases(), true)) { if (!\in_array('actsocialaction', $qb->getAllAliases(), true)) {
$qb->leftJoin('activity.socialActions', 'actsocialaction'); $qb->leftJoin('activity.socialActions', 'actsocialaction');
@@ -42,32 +42,17 @@ class BySocialActionAggregator implements AggregatorInterface
return Declarations::ACTIVITY_ACP; return Declarations::ACTIVITY_ACP;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
// no form // 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function getLabels($key, array $values, $data): callable public function getLabels($key, array $values, $data)
{ {
return function ($value) { return function ($value) {
if ('_header' === $value) { if ('_header' === $value) {

View File

@@ -27,7 +27,7 @@ class BySocialIssueAggregator implements AggregatorInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
if (!\in_array('actsocialissue', $qb->getAllAliases(), true)) { if (!\in_array('actsocialissue', $qb->getAllAliases(), true)) {
$qb->leftJoin('activity.socialIssues', 'actsocialissue'); $qb->leftJoin('activity.socialIssues', 'actsocialissue');
@@ -42,32 +42,17 @@ class BySocialIssueAggregator implements AggregatorInterface
return Declarations::ACTIVITY_ACP; return Declarations::ACTIVITY_ACP;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
// no form // 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function getLabels($key, array $values, $data): callable public function getLabels($key, array $values, $data)
{ {
return function ($value): string { return function ($value): string {
if ('_header' === $value) { if ('_header' === $value) {

View File

@@ -25,7 +25,7 @@ final readonly class ActivityLocationAggregator implements AggregatorInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
if (!\in_array('actloc', $qb->getAllAliases(), true)) { if (!\in_array('actloc', $qb->getAllAliases(), true)) {
$qb->leftJoin('activity.location', 'actloc'); $qb->leftJoin('activity.location', 'actloc');
@@ -39,32 +39,17 @@ final readonly class ActivityLocationAggregator implements AggregatorInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
// no form required for this aggregator // 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function getLabels($key, array $values, $data): callable public function getLabels($key, array $values, $data): \Closure
{ {
return function ($value): string { return function ($value): string {
if ('_header' === $value) { if ('_header' === $value) {
@@ -84,7 +69,7 @@ final readonly class ActivityLocationAggregator implements AggregatorInterface
return [self::KEY]; return [self::KEY];
} }
public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface public function getTitle()
{ {
return 'export.aggregator.activity.by_location.Title'; return 'export.aggregator.activity.by_location.Title';
} }

View File

@@ -22,29 +22,14 @@ final readonly class ActivityPresenceAggregator implements AggregatorInterface
{ {
public function __construct(private ActivityPresenceRepositoryInterface $activityPresenceRepository, private TranslatableStringHelperInterface $translatableStringHelper) {} public function __construct(private ActivityPresenceRepositoryInterface $activityPresenceRepository, private TranslatableStringHelperInterface $translatableStringHelper) {}
public function buildForm(FormBuilderInterface $builder): void {} 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function getLabels($key, array $values, mixed $data): callable public function getLabels($key, array $values, mixed $data)
{ {
return function (int|string|null $value): string { return function (int|string|null $value): string {
if ('_header' === $value) { if ('_header' === $value) {
@@ -59,7 +44,7 @@ final readonly class ActivityPresenceAggregator implements AggregatorInterface
}; };
} }
public function getQueryKeys($data): array public function getQueryKeys($data)
{ {
return ['activity_presence_aggregator_attendee']; return ['activity_presence_aggregator_attendee'];
} }
@@ -74,13 +59,13 @@ final readonly class ActivityPresenceAggregator implements AggregatorInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data): void
{ {
$qb->addSelect('IDENTITY(activity.attendee) AS activity_presence_aggregator_attendee'); $qb->addSelect('IDENTITY(activity.attendee) AS activity_presence_aggregator_attendee');
$qb->addGroupBy('activity_presence_aggregator_attendee'); $qb->addGroupBy('activity_presence_aggregator_attendee');
} }
public function applyOn(): string public function applyOn()
{ {
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }

View File

@@ -36,7 +36,7 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
// add select element // add select element
if ('reasons' === $data['level']) { if ('reasons' === $data['level']) {
@@ -72,7 +72,7 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder->add( $builder->add(
'level', 'level',
@@ -89,21 +89,6 @@ 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 public function getFormDefaultData(): array
{ {
return [ return [
@@ -111,7 +96,7 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali
]; ];
} }
public function getLabels($key, array $values, $data): callable public function getLabels($key, array $values, $data)
{ {
return function ($value) use ($data) { return function ($value) use ($data) {
if ('_header' === $value) { if ('_header' === $value) {
@@ -140,7 +125,7 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali
}; };
} }
public function getQueryKeys($data): array public function getQueryKeys($data)
{ {
// add select element // add select element
if ('reasons' === $data['level']) { if ('reasons' === $data['level']) {
@@ -154,12 +139,12 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali
throw new \RuntimeException('The data provided are not recognised.'); throw new \RuntimeException('The data provided are not recognised.');
} }
public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface public function getTitle()
{ {
return 'Aggregate by activity reason'; return 'Aggregate by activity reason';
} }
public function validateForm($data, ExecutionContextInterface $context): void public function validateForm($data, ExecutionContextInterface $context)
{ {
if (null === $data['level']) { if (null === $data['level']) {
$context $context

View File

@@ -29,7 +29,7 @@ class ActivityTypeAggregator implements AggregatorInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
if (!\in_array('acttype', $qb->getAllAliases(), true)) { if (!\in_array('acttype', $qb->getAllAliases(), true)) {
$qb->leftJoin('activity.activityType', 'acttype'); $qb->leftJoin('activity.activityType', 'acttype');
@@ -44,32 +44,17 @@ class ActivityTypeAggregator implements AggregatorInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
// no form required for this aggregator // 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function getLabels($key, array $values, $data): callable public function getLabels($key, array $values, $data): \Closure
{ {
return function (int|string|null $value): string { return function (int|string|null $value): string {
if ('_header' === $value) { if ('_header' === $value) {
@@ -89,7 +74,7 @@ class ActivityTypeAggregator implements AggregatorInterface
return [self::KEY]; return [self::KEY];
} }
public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface public function getTitle()
{ {
return 'Aggregate by activity type'; return 'Aggregate by activity type';
} }

View File

@@ -29,7 +29,7 @@ class ActivityUserAggregator implements AggregatorInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
// add select element // add select element
$qb->addSelect(sprintf('IDENTITY(activity.user) AS %s', self::KEY)); $qb->addSelect(sprintf('IDENTITY(activity.user) AS %s', self::KEY));
@@ -43,32 +43,17 @@ class ActivityUserAggregator implements AggregatorInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
// nothing to add // 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function getLabels($key, $values, $data): callable public function getLabels($key, $values, $data): \Closure
{ {
return function ($value) { return function ($value) {
if ('_header' === $value) { if ('_header' === $value) {
@@ -85,7 +70,7 @@ class ActivityUserAggregator implements AggregatorInterface
}; };
} }
public function getQueryKeys($data): array public function getQueryKeys($data)
{ {
return [self::KEY]; return [self::KEY];
} }

View File

@@ -27,7 +27,7 @@ class ActivityUsersAggregator implements AggregatorInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
if (!\in_array('actusers', $qb->getAllAliases(), true)) { if (!\in_array('actusers', $qb->getAllAliases(), true)) {
$qb->leftJoin('activity.users', 'actusers'); $qb->leftJoin('activity.users', 'actusers');
@@ -43,32 +43,17 @@ class ActivityUsersAggregator implements AggregatorInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
// nothing to add on the form // 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function getLabels($key, array $values, $data): callable public function getLabels($key, array $values, $data)
{ {
return function ($value) { return function ($value) {
if ('_header' === $value) { if ('_header' === $value) {
@@ -85,12 +70,12 @@ class ActivityUsersAggregator implements AggregatorInterface
}; };
} }
public function getQueryKeys($data): array public function getQueryKeys($data)
{ {
return ['activity_users_aggregator']; return ['activity_users_aggregator'];
} }
public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface public function getTitle()
{ {
return 'Aggregate by activity users'; return 'Aggregate by activity users';
} }

View File

@@ -34,7 +34,7 @@ class ActivityUsersJobAggregator implements AggregatorInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$p = self::PREFIX; $p = self::PREFIX;
@@ -65,29 +65,14 @@ class ActivityUsersJobAggregator implements AggregatorInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void {} 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function getLabels($key, array $values, $data): callable public function getLabels($key, array $values, $data)
{ {
return function ($value): string { return function ($value): string {
if ('_header' === $value) { if ('_header' === $value) {

View File

@@ -34,7 +34,7 @@ class ActivityUsersScopeAggregator implements AggregatorInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$p = self::PREFIX; $p = self::PREFIX;
@@ -65,29 +65,14 @@ class ActivityUsersScopeAggregator implements AggregatorInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void {} 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function getLabels($key, array $values, $data): callable public function getLabels($key, array $values, $data)
{ {
return function ($value): string { return function ($value): string {
if ('_header' === $value) { if ('_header' === $value) {

View File

@@ -27,7 +27,7 @@ class ByCreatorAggregator implements AggregatorInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$qb->addSelect('IDENTITY(activity.createdBy) AS creator_aggregator'); $qb->addSelect('IDENTITY(activity.createdBy) AS creator_aggregator');
$qb->addGroupBy('creator_aggregator'); $qb->addGroupBy('creator_aggregator');
@@ -38,32 +38,17 @@ class ByCreatorAggregator implements AggregatorInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
// no form // 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function getLabels($key, array $values, $data): callable public function getLabels($key, array $values, $data)
{ {
return function ($value): string { return function ($value): string {
if ('_header' === $value) { if ('_header' === $value) {

View File

@@ -27,7 +27,7 @@ class ByThirdpartyAggregator implements AggregatorInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
if (!\in_array('acttparty', $qb->getAllAliases(), true)) { if (!\in_array('acttparty', $qb->getAllAliases(), true)) {
$qb->leftJoin('activity.thirdParties', 'acttparty'); $qb->leftJoin('activity.thirdParties', 'acttparty');
@@ -42,32 +42,17 @@ class ByThirdpartyAggregator implements AggregatorInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
// no form // 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function getLabels($key, array $values, $data): callable public function getLabels($key, array $values, $data)
{ {
return function ($value): string { return function ($value): string {
if ('_header' === $value) { if ('_header' === $value) {

View File

@@ -34,7 +34,7 @@ class CreatorJobAggregator implements AggregatorInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$p = self::PREFIX; $p = self::PREFIX;
@@ -65,29 +65,14 @@ class CreatorJobAggregator implements AggregatorInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void {} 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function getLabels($key, array $values, $data): callable public function getLabels($key, array $values, $data)
{ {
return function ($value): string { return function ($value): string {
if ('_header' === $value) { if ('_header' === $value) {

View File

@@ -34,7 +34,7 @@ class CreatorScopeAggregator implements AggregatorInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$p = self::PREFIX; $p = self::PREFIX;
@@ -65,29 +65,14 @@ class CreatorScopeAggregator implements AggregatorInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void {} 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function getLabels($key, array $values, $data): callable public function getLabels($key, array $values, $data)
{ {
return function ($value): string { return function ($value): string {
if ('_header' === $value) { if ('_header' === $value) {

View File

@@ -32,7 +32,7 @@ class DateAggregator implements AggregatorInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$order = null; $order = null;
@@ -67,7 +67,7 @@ class DateAggregator implements AggregatorInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder->add('frequency', ChoiceType::class, [ $builder->add('frequency', ChoiceType::class, [
'choices' => self::CHOICES, 'choices' => self::CHOICES,
@@ -76,27 +76,12 @@ 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 public function getFormDefaultData(): array
{ {
return ['frequency' => self::DEFAULT_CHOICE]; return ['frequency' => self::DEFAULT_CHOICE];
} }
public function getLabels($key, array $values, $data): callable public function getLabels($key, array $values, $data)
{ {
return static function ($value) use ($data): string { return static function ($value) use ($data): string {
if ('_header' === $value) { if ('_header' === $value) {

View File

@@ -27,7 +27,7 @@ class LocationTypeAggregator implements AggregatorInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
if (!\in_array('actloc', $qb->getAllAliases(), true)) { if (!\in_array('actloc', $qb->getAllAliases(), true)) {
$qb->leftJoin('activity.location', 'actloc'); $qb->leftJoin('activity.location', 'actloc');
@@ -42,32 +42,17 @@ class LocationTypeAggregator implements AggregatorInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
// no form // 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function getLabels($key, array $values, $data): callable public function getLabels($key, array $values, $data)
{ {
return function ($value): string { return function ($value): string {
if ('_header' === $value) { if ('_header' === $value) {

View File

@@ -24,32 +24,17 @@ final readonly class HouseholdAggregator implements AggregatorInterface
{ {
public function __construct(private HouseholdRepository $householdRepository) {} public function __construct(private HouseholdRepository $householdRepository) {}
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
// nothing to add here // 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function getLabels($key, array $values, mixed $data): callable public function getLabels($key, array $values, mixed $data)
{ {
return function (int|string|null $value): string|int { return function (int|string|null $value): string|int {
if ('_header' === $value) { if ('_header' === $value) {
@@ -64,12 +49,12 @@ final readonly class HouseholdAggregator implements AggregatorInterface
}; };
} }
public function getQueryKeys($data): array public function getQueryKeys($data)
{ {
return ['activity_household_agg']; return ['activity_household_agg'];
} }
public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface public function getTitle()
{ {
return 'export.aggregator.person.by_household.title'; return 'export.aggregator.person.by_household.title';
} }
@@ -79,7 +64,7 @@ final readonly class HouseholdAggregator implements AggregatorInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$qb->join( $qb->join(
HouseholdMember::class, HouseholdMember::class,
@@ -107,7 +92,7 @@ final readonly class HouseholdAggregator implements AggregatorInterface
->addGroupBy('activity_household_agg'); ->addGroupBy('activity_household_agg');
} }
public function applyOn(): string public function applyOn()
{ {
return Declarations::ACTIVITY_PERSON; return Declarations::ACTIVITY_PERSON;
} }

View File

@@ -21,42 +21,27 @@ final readonly class PersonAggregator implements AggregatorInterface
{ {
public function __construct(private LabelPersonHelper $labelPersonHelper) {} public function __construct(private LabelPersonHelper $labelPersonHelper) {}
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
// nothing to add here // 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function getLabels($key, array $values, mixed $data): callable public function getLabels($key, array $values, mixed $data)
{ {
return $this->labelPersonHelper->getLabel($key, $values, 'export.aggregator.person.by_person.person'); return $this->labelPersonHelper->getLabel($key, $values, 'export.aggregator.person.by_person.person');
} }
public function getQueryKeys($data): array public function getQueryKeys($data)
{ {
return ['activity_by_person_agg']; return ['activity_by_person_agg'];
} }
public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface public function getTitle()
{ {
return 'export.aggregator.person.by_person.title'; return 'export.aggregator.person.by_person.title';
} }
@@ -66,14 +51,14 @@ final readonly class PersonAggregator implements AggregatorInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$qb $qb
->addSelect('IDENTITY(activity.person) AS activity_by_person_agg') ->addSelect('IDENTITY(activity.person) AS activity_by_person_agg')
->addGroupBy('activity_by_person_agg'); ->addGroupBy('activity_by_person_agg');
} }
public function applyOn(): string public function applyOn()
{ {
return Declarations::ACTIVITY_PERSON; return Declarations::ACTIVITY_PERSON;
} }

View File

@@ -27,32 +27,17 @@ final readonly class PersonsAggregator implements AggregatorInterface
public function __construct(private LabelPersonHelper $labelPersonHelper) {} public function __construct(private LabelPersonHelper $labelPersonHelper) {}
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
// nothing to add here // 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function getLabels($key, array $values, mixed $data): callable public function getLabels($key, array $values, mixed $data)
{ {
if ($key !== self::PREFIX.'_pid') { if ($key !== self::PREFIX.'_pid') {
throw new \UnexpectedValueException('this key should not be handled: '.$key); throw new \UnexpectedValueException('this key should not be handled: '.$key);
@@ -61,12 +46,12 @@ final readonly class PersonsAggregator implements AggregatorInterface
return $this->labelPersonHelper->getLabel($key, $values, 'export.aggregator.activity.by_persons.Persons'); return $this->labelPersonHelper->getLabel($key, $values, 'export.aggregator.activity.by_persons.Persons');
} }
public function getQueryKeys($data): array public function getQueryKeys($data)
{ {
return [self::PREFIX.'_pid']; return [self::PREFIX.'_pid'];
} }
public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface public function getTitle()
{ {
return 'export.aggregator.activity.by_persons.Group activity by persons'; return 'export.aggregator.activity.by_persons.Group activity by persons';
} }
@@ -76,7 +61,7 @@ final readonly class PersonsAggregator implements AggregatorInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$p = self::PREFIX; $p = self::PREFIX;
@@ -86,7 +71,7 @@ final readonly class PersonsAggregator implements AggregatorInterface
->addGroupBy("{$p}_pid"); ->addGroupBy("{$p}_pid");
} }
public function applyOn(): string public function applyOn()
{ {
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }

View File

@@ -26,7 +26,7 @@ class SentReceivedAggregator implements AggregatorInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data): void
{ {
$qb->addSelect('activity.sentReceived AS activity_sentreceived_aggregator') $qb->addSelect('activity.sentReceived AS activity_sentreceived_aggregator')
->addGroupBy('activity_sentreceived_aggregator'); ->addGroupBy('activity_sentreceived_aggregator');
@@ -42,21 +42,6 @@ class SentReceivedAggregator implements AggregatorInterface
// No form needed // 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 public function getFormDefaultData(): array
{ {
return []; return [];

View File

@@ -15,7 +15,6 @@ use Chill\ActivityBundle\Export\Declarations;
use Chill\ActivityBundle\Repository\ActivityRepository; use Chill\ActivityBundle\Repository\ActivityRepository;
use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter; use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
use Chill\MainBundle\Export\AccompanyingCourseExportHelper; use Chill\MainBundle\Export\AccompanyingCourseExportHelper;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\ExportInterface; use Chill\MainBundle\Export\ExportInterface;
use Chill\MainBundle\Export\FormatterInterface; use Chill\MainBundle\Export\FormatterInterface;
use Chill\MainBundle\Export\GroupedExportInterface; use Chill\MainBundle\Export\GroupedExportInterface;
@@ -39,21 +38,6 @@ class AvgActivityDuration implements ExportInterface, GroupedExportInterface
public function buildForm(FormBuilderInterface $builder) {} 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 public function getFormDefaultData(): array
{ {
return []; return [];
@@ -88,7 +72,7 @@ class AvgActivityDuration implements ExportInterface, GroupedExportInterface
return ['export_avg_activity_duration']; return ['export_avg_activity_duration'];
} }
public function getResult($query, $data, ExportGenerationContext $context): array public function getResult($query, $data)
{ {
return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); return $query->getQuery()->getResult(Query::HYDRATE_SCALAR);
} }
@@ -103,7 +87,7 @@ class AvgActivityDuration implements ExportInterface, GroupedExportInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function initiateQuery(array $requiredModifiers, array $acl, array $data, ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
{ {
$centers = array_map(static fn ($el) => $el['center'], $acl); $centers = array_map(static fn ($el) => $el['center'], $acl);

View File

@@ -15,7 +15,6 @@ use Chill\ActivityBundle\Entity\Activity;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter; use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
use Chill\MainBundle\Export\AccompanyingCourseExportHelper; use Chill\MainBundle\Export\AccompanyingCourseExportHelper;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\ExportInterface; use Chill\MainBundle\Export\ExportInterface;
use Chill\MainBundle\Export\FormatterInterface; use Chill\MainBundle\Export\FormatterInterface;
use Chill\MainBundle\Export\GroupedExportInterface; use Chill\MainBundle\Export\GroupedExportInterface;
@@ -47,21 +46,6 @@ class AvgActivityVisitDuration implements ExportInterface, GroupedExportInterfac
// TODO: Implement buildForm() method. // 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 public function getFormDefaultData(): array
{ {
return []; return [];
@@ -96,7 +80,7 @@ class AvgActivityVisitDuration implements ExportInterface, GroupedExportInterfac
return ['export_avg_activity_visit_duration']; return ['export_avg_activity_visit_duration'];
} }
public function getResult($query, $data, ExportGenerationContext $context): array public function getResult($query, $data)
{ {
return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); return $query->getQuery()->getResult(Query::HYDRATE_SCALAR);
} }
@@ -111,7 +95,7 @@ class AvgActivityVisitDuration implements ExportInterface, GroupedExportInterfac
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function initiateQuery(array $requiredModifiers, array $acl, array $data, ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
{ {
$centers = array_map(static fn ($el) => $el['center'], $acl); $centers = array_map(static fn ($el) => $el['center'], $acl);

View File

@@ -43,21 +43,6 @@ class CountActivity implements ExportInterface, GroupedExportInterface
public function buildForm(FormBuilderInterface $builder) {} 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 public function getFormDefaultData(): array
{ {
return []; return [];
@@ -92,7 +77,7 @@ class CountActivity implements ExportInterface, GroupedExportInterface
return ['export_count_activity']; return ['export_count_activity'];
} }
public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array public function getResult($query, $data)
{ {
return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); return $query->getQuery()->getResult(Query::HYDRATE_SCALAR);
} }
@@ -107,7 +92,7 @@ class CountActivity implements ExportInterface, GroupedExportInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
{ {
$centers = array_map(static fn ($el) => $el['center'], $acl); $centers = array_map(static fn ($el) => $el['center'], $acl);

View File

@@ -44,21 +44,6 @@ final readonly class CountHouseholdOnActivity implements ExportInterface, Groupe
public function buildForm(FormBuilderInterface $builder) {} 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 public function getFormDefaultData(): array
{ {
return []; return [];
@@ -93,7 +78,7 @@ final readonly class CountHouseholdOnActivity implements ExportInterface, Groupe
return ['export_count_activity']; return ['export_count_activity'];
} }
public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array public function getResult($query, $data)
{ {
return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); return $query->getQuery()->getResult(Query::HYDRATE_SCALAR);
} }
@@ -108,7 +93,7 @@ final readonly class CountHouseholdOnActivity implements ExportInterface, Groupe
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
{ {
$centers = array_map(static fn ($el) => $el['center'], $acl); $centers = array_map(static fn ($el) => $el['center'], $acl);

View File

@@ -43,21 +43,6 @@ class CountPersonsOnActivity implements ExportInterface, GroupedExportInterface
public function buildForm(FormBuilderInterface $builder) {} 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 public function getFormDefaultData(): array
{ {
return []; return [];
@@ -92,7 +77,7 @@ class CountPersonsOnActivity implements ExportInterface, GroupedExportInterface
return ['export_count_activity']; return ['export_count_activity'];
} }
public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array public function getResult($query, $data)
{ {
return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); return $query->getQuery()->getResult(Query::HYDRATE_SCALAR);
} }
@@ -107,7 +92,7 @@ class CountPersonsOnActivity implements ExportInterface, GroupedExportInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
{ {
$centers = array_map(static fn ($el) => $el['center'], $acl); $centers = array_map(static fn ($el) => $el['center'], $acl);

View File

@@ -17,7 +17,6 @@ use Chill\ActivityBundle\Export\Export\ListActivityHelper;
use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter; use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
use Chill\MainBundle\Entity\Scope; use Chill\MainBundle\Entity\Scope;
use Chill\MainBundle\Export\AccompanyingCourseExportHelper; use Chill\MainBundle\Export\AccompanyingCourseExportHelper;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\GroupedExportInterface; use Chill\MainBundle\Export\GroupedExportInterface;
use Chill\MainBundle\Export\Helper\TranslatableStringExportLabelHelper; use Chill\MainBundle\Export\Helper\TranslatableStringExportLabelHelper;
use Chill\MainBundle\Export\ListInterface; use Chill\MainBundle\Export\ListInterface;
@@ -39,21 +38,6 @@ final readonly class ListActivity implements ListInterface, GroupedExportInterfa
$this->helper->buildForm($builder); $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 public function getFormDefaultData(): array
{ {
return []; return [];
@@ -89,7 +73,7 @@ final readonly class ListActivity implements ListInterface, GroupedExportInterfa
}; };
} }
public function getQueryKeys($data): array public function getQueryKeys($data)
{ {
return return
array_merge( array_merge(
@@ -101,23 +85,25 @@ final readonly class ListActivity implements ListInterface, GroupedExportInterfa
); );
} }
public function getResult($query, $data, ExportGenerationContext $context): array public function getResult($query, $data)
{ {
return $this->helper->getResult($query, $data); return $this->helper->getResult($query, $data);
} }
public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface public function getTitle()
{ {
return ListActivityHelper::MSG_KEY.'List activity linked to a course'; return ListActivityHelper::MSG_KEY.'List activity linked to a course';
} }
public function getType(): string public function getType()
{ {
return $this->helper->getType(); return $this->helper->getType();
} }
public function initiateQuery(array $requiredModifiers, array $acl, array $data, ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
{ {
$centers = array_map(static fn ($el) => $el['center'], $acl);
$qb = $this->entityManager->createQueryBuilder(); $qb = $this->entityManager->createQueryBuilder();
$qb $qb
@@ -128,7 +114,7 @@ final readonly class ListActivity implements ListInterface, GroupedExportInterfa
->leftJoin('acppart.person', 'person') ->leftJoin('acppart.person', 'person')
->andWhere('acppart.startDate != acppart.endDate OR acppart.endDate IS NULL'); ->andWhere('acppart.startDate != acppart.endDate OR acppart.endDate IS NULL');
$this->filterListAccompanyingPeriodHelper->addFilterAccompanyingPeriods($qb, $requiredModifiers, $acl, $context->byUser, $data); $this->filterListAccompanyingPeriodHelper->addFilterAccompanyingPeriods($qb, $requiredModifiers, $acl, $data);
$qb $qb
// some grouping are necessary // some grouping are necessary

View File

@@ -40,21 +40,9 @@ class SumActivityDuration implements ExportInterface, GroupedExportInterface
$this->filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center']; $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
{ {
return 1; // TODO: Implement buildForm() method.
}
public function normalizeFormData(array $formData): array
{
return [];
}
public function denormalizeFormData(array $formData, int $fromVersion): array
{
return [];
} }
public function getFormDefaultData(): array public function getFormDefaultData(): array
@@ -91,7 +79,7 @@ class SumActivityDuration implements ExportInterface, GroupedExportInterface
return ['export_sum_activity_duration']; return ['export_sum_activity_duration'];
} }
public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array public function getResult($query, $data)
{ {
return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); return $query->getQuery()->getResult(Query::HYDRATE_SCALAR);
} }
@@ -106,7 +94,7 @@ class SumActivityDuration implements ExportInterface, GroupedExportInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
{ {
$centers = array_map(static fn ($el) => $el['center'], $acl); $centers = array_map(static fn ($el) => $el['center'], $acl);

View File

@@ -40,21 +40,9 @@ class SumActivityVisitDuration implements ExportInterface, GroupedExportInterfac
$this->filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center']; $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
{ {
return 1; // TODO: Implement buildForm() method.
}
public function normalizeFormData(array $formData): array
{
return [];
}
public function denormalizeFormData(array $formData, int $fromVersion): array
{
return [];
} }
public function getFormDefaultData(): array public function getFormDefaultData(): array
@@ -91,7 +79,7 @@ class SumActivityVisitDuration implements ExportInterface, GroupedExportInterfac
return ['export_sum_activity_visit_duration']; return ['export_sum_activity_visit_duration'];
} }
public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array public function getResult($query, $data)
{ {
return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); return $query->getQuery()->getResult(Query::HYDRATE_SCALAR);
} }
@@ -106,7 +94,7 @@ class SumActivityVisitDuration implements ExportInterface, GroupedExportInterfac
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
{ {
$centers = array_map(static fn ($el) => $el['center'], $acl); $centers = array_map(static fn ($el) => $el['center'], $acl);

View File

@@ -35,21 +35,6 @@ class CountActivity implements ExportInterface, GroupedExportInterface
public function buildForm(FormBuilderInterface $builder) {} 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 public function getFormDefaultData(): array
{ {
return []; return [];
@@ -79,17 +64,17 @@ class CountActivity implements ExportInterface, GroupedExportInterface
return static fn ($value) => '_header' === $value ? 'Number of activities linked to a person' : $value; return static fn ($value) => '_header' === $value ? 'Number of activities linked to a person' : $value;
} }
public function getQueryKeys($data): array public function getQueryKeys($data)
{ {
return ['export_count_activity']; return ['export_count_activity'];
} }
public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array public function getResult($query, $data)
{ {
return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); return $query->getQuery()->getResult(Query::HYDRATE_SCALAR);
} }
public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface public function getTitle()
{ {
return 'Count activities linked to a person'; return 'Count activities linked to a person';
} }
@@ -99,7 +84,7 @@ class CountActivity implements ExportInterface, GroupedExportInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
{ {
$centers = array_map(static fn ($el) => $el['center'], $acl); $centers = array_map(static fn ($el) => $el['center'], $acl);

View File

@@ -36,21 +36,6 @@ final readonly class CountHouseholdOnActivity implements ExportInterface, Groupe
public function buildForm(FormBuilderInterface $builder) {} 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 public function getFormDefaultData(): array
{ {
return []; return [];
@@ -80,17 +65,17 @@ final readonly class CountHouseholdOnActivity implements ExportInterface, Groupe
return static fn ($value) => '_header' === $value ? 'export.export.count_household_on_activity_person.header' : $value; return static fn ($value) => '_header' === $value ? 'export.export.count_household_on_activity_person.header' : $value;
} }
public function getQueryKeys($data): array public function getQueryKeys($data)
{ {
return ['export_count_activity']; return ['export_count_activity'];
} }
public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array public function getResult($query, $data)
{ {
return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); return $query->getQuery()->getResult(Query::HYDRATE_SCALAR);
} }
public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface public function getTitle()
{ {
return 'export.export.count_household_on_activity_person.title'; return 'export.export.count_household_on_activity_person.title';
} }
@@ -100,7 +85,7 @@ final readonly class CountHouseholdOnActivity implements ExportInterface, Groupe
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
{ {
$centers = array_map(static fn ($el) => $el['center'], $acl); $centers = array_map(static fn ($el) => $el['center'], $acl);

View File

@@ -78,21 +78,6 @@ 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 public function getFormDefaultData(): array
{ {
return []; return [];
@@ -182,17 +167,17 @@ class ListActivity implements ListInterface, GroupedExportInterface
} }
} }
public function getQueryKeys($data): array public function getQueryKeys($data)
{ {
return $data['fields']; return $data['fields'];
} }
public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array public function getResult($query, $data)
{ {
return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); return $query->getQuery()->getResult(Query::HYDRATE_SCALAR);
} }
public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface public function getTitle()
{ {
return 'List activity linked to a person'; return 'List activity linked to a person';
} }
@@ -202,7 +187,7 @@ class ListActivity implements ListInterface, GroupedExportInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
{ {
$centers = array_map(static fn ($el) => $el['center'], $acl); $centers = array_map(static fn ($el) => $el['center'], $acl);

View File

@@ -49,21 +49,6 @@ class StatActivityDuration implements ExportInterface, GroupedExportInterface
public function buildForm(FormBuilderInterface $builder) {} 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 public function getFormDefaultData(): array
{ {
return []; return [];
@@ -99,17 +84,17 @@ class StatActivityDuration implements ExportInterface, GroupedExportInterface
return static fn (string $value) => '_header' === $value ? $header : $value; return static fn (string $value) => '_header' === $value ? $header : $value;
} }
public function getQueryKeys($data): array public function getQueryKeys($data)
{ {
return ['export_stat_activity']; return ['export_stat_activity'];
} }
public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array public function getResult($query, $data)
{ {
return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); return $query->getQuery()->getResult(Query::HYDRATE_SCALAR);
} }
public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface public function getTitle()
{ {
if (self::SUM === $this->action) { if (self::SUM === $this->action) {
return 'Sum activity linked to a person duration'; return 'Sum activity linked to a person duration';
@@ -123,7 +108,7 @@ class StatActivityDuration implements ExportInterface, GroupedExportInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
{ {
$centers = array_map( $centers = array_map(
static fn (array $el): Center => $el['center'], static fn (array $el): Center => $el['center'],

View File

@@ -14,7 +14,6 @@ namespace Chill\ActivityBundle\Export\Filter\ACPFilters;
use Chill\ActivityBundle\Entity\Activity; use Chill\ActivityBundle\Entity\Activity;
use Chill\ActivityBundle\Entity\ActivityType; use Chill\ActivityBundle\Entity\ActivityType;
use Chill\ActivityBundle\Repository\ActivityTypeRepositoryInterface; use Chill\ActivityBundle\Repository\ActivityTypeRepositoryInterface;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Form\Type\PickRollingDateType; use Chill\MainBundle\Form\Type\PickRollingDateType;
use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface; use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface;
@@ -26,7 +25,6 @@ use Symfony\Component\Form\FormBuilderInterface;
final readonly class ActivityTypeFilter implements FilterInterface 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'; private const BASE_EXISTS = 'SELECT 1 FROM '.Activity::class.' act_type_filter_activity WHERE act_type_filter_activity.accompanyingPeriod = acp';
public function __construct( public function __construct(
@@ -40,7 +38,7 @@ final readonly class ActivityTypeFilter implements FilterInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$exists = self::BASE_EXISTS; $exists = self::BASE_EXISTS;
@@ -64,12 +62,12 @@ final readonly class ActivityTypeFilter implements FilterInterface
} }
} }
public function applyOn(): string public function applyOn()
{ {
return Declarations::ACP_TYPE; return Declarations::ACP_TYPE;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder->add('accepted_activitytypes', EntityType::class, [ $builder->add('accepted_activitytypes', EntityType::class, [
'class' => ActivityType::class, 'class' => ActivityType::class,
@@ -94,21 +92,6 @@ 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 public function getFormDefaultData(): array
{ {
return [ return [
@@ -118,7 +101,7 @@ final readonly class ActivityTypeFilter implements FilterInterface
]; ];
} }
public function describeAction($data, ExportGenerationContext $context): array public function describeAction($data, $format = 'string'): array
{ {
$types = []; $types = [];

View File

@@ -12,28 +12,23 @@ declare(strict_types=1);
namespace Chill\ActivityBundle\Export\Filter\ACPFilters; namespace Chill\ActivityBundle\Export\Filter\ACPFilters;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\MainBundle\Export\ExportDataNormalizerTrait;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\PersonBundle\Entity\SocialWork\SocialAction; use Chill\PersonBundle\Entity\SocialWork\SocialAction;
use Chill\PersonBundle\Form\Type\PickSocialActionType; use Chill\PersonBundle\Form\Type\PickSocialActionType;
use Chill\PersonBundle\Repository\SocialWork\SocialActionRepository;
use Chill\PersonBundle\Templating\Entity\SocialActionRender; use Chill\PersonBundle\Templating\Entity\SocialActionRender;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
class BySocialActionFilter implements FilterInterface class BySocialActionFilter implements FilterInterface
{ {
use ExportDataNormalizerTrait; public function __construct(private readonly SocialActionRender $actionRender) {}
public function __construct(private readonly SocialActionRender $actionRender, private readonly SocialActionRepository $socialActionRepository) {}
public function addRole(): ?string public function addRole(): ?string
{ {
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
if (!\in_array('actsocialaction', $qb->getAllAliases(), true)) { if (!\in_array('actsocialaction', $qb->getAllAliases(), true)) {
$qb->join('activity.socialActions', 'actsocialaction'); $qb->join('activity.socialActions', 'actsocialaction');
@@ -53,36 +48,19 @@ class BySocialActionFilter implements FilterInterface
return Declarations::ACTIVITY_ACP; return Declarations::ACTIVITY_ACP;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder->add('accepted_socialactions', PickSocialActionType::class, [ $builder->add('accepted_socialactions', PickSocialActionType::class, [
'multiple' => true, 'multiple' => true,
]); ]);
} }
public function getNormalizationVersion(): int
{
return 1;
}
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 public function getFormDefaultData(): array
{ {
return [ return [];
'accepted_socialactions' => [],
];
} }
public function describeAction($data, ExportGenerationContext $context): array public function describeAction($data, $format = 'string'): array
{ {
$actions = []; $actions = [];

View File

@@ -12,28 +12,23 @@ declare(strict_types=1);
namespace Chill\ActivityBundle\Export\Filter\ACPFilters; namespace Chill\ActivityBundle\Export\Filter\ACPFilters;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\MainBundle\Export\ExportDataNormalizerTrait;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\PersonBundle\Entity\SocialWork\SocialIssue; use Chill\PersonBundle\Entity\SocialWork\SocialIssue;
use Chill\PersonBundle\Form\Type\PickSocialIssueType; use Chill\PersonBundle\Form\Type\PickSocialIssueType;
use Chill\PersonBundle\Repository\SocialWork\SocialIssueRepository;
use Chill\PersonBundle\Templating\Entity\SocialIssueRender; use Chill\PersonBundle\Templating\Entity\SocialIssueRender;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
class BySocialIssueFilter implements FilterInterface class BySocialIssueFilter implements FilterInterface
{ {
use ExportDataNormalizerTrait; public function __construct(private readonly SocialIssueRender $issueRender) {}
public function __construct(private readonly SocialIssueRender $issueRender, private readonly SocialIssueRepository $issueRepository) {}
public function addRole(): ?string public function addRole(): ?string
{ {
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
if (!\in_array('actsocialissue', $qb->getAllAliases(), true)) { if (!\in_array('actsocialissue', $qb->getAllAliases(), true)) {
$qb->join('activity.socialIssues', 'actsocialissue'); $qb->join('activity.socialIssues', 'actsocialissue');
@@ -53,34 +48,19 @@ class BySocialIssueFilter implements FilterInterface
return Declarations::ACTIVITY_ACP; return Declarations::ACTIVITY_ACP;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder->add('accepted_socialissues', PickSocialIssueType::class, [ $builder->add('accepted_socialissues', PickSocialIssueType::class, [
'multiple' => true, '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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function describeAction($data, ExportGenerationContext $context): array public function describeAction($data, $format = 'string'): array
{ {
$issues = []; $issues = [];

View File

@@ -12,7 +12,6 @@ declare(strict_types=1);
namespace Chill\ActivityBundle\Export\Filter\ACPFilters; namespace Chill\ActivityBundle\Export\Filter\ACPFilters;
use Chill\ActivityBundle\Entity\Activity; use Chill\ActivityBundle\Entity\Activity;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\PersonBundle\Export\Declarations; use Chill\PersonBundle\Export\Declarations;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
@@ -28,7 +27,7 @@ class HasNoActivityFilter implements FilterInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$qb $qb
->andWhere(' ->andWhere('
@@ -44,32 +43,17 @@ class HasNoActivityFilter implements FilterInterface
return Declarations::ACP_TYPE; return Declarations::ACP_TYPE;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
// no form needed // 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function describeAction($data, ExportGenerationContext $context): array public function describeAction($data, $format = 'string'): array
{ {
return ['Filtered acp which has no activities', []]; return ['Filtered acp which has no activities', []];
} }

View File

@@ -12,7 +12,6 @@ declare(strict_types=1);
namespace Chill\ActivityBundle\Export\Filter\ACPFilters; namespace Chill\ActivityBundle\Export\Filter\ACPFilters;
use Chill\ActivityBundle\Entity\Activity; use Chill\ActivityBundle\Entity\Activity;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Form\Type\PickRollingDateType; use Chill\MainBundle\Form\Type\PickRollingDateType;
use Chill\MainBundle\Service\RollingDate\RollingDate; use Chill\MainBundle\Service\RollingDate\RollingDate;
@@ -26,12 +25,12 @@ final readonly class PeriodHavingActivityBetweenDatesFilter implements FilterInt
private RollingDateConverterInterface $rollingDateConverter, private RollingDateConverterInterface $rollingDateConverter,
) {} ) {}
public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface public function getTitle()
{ {
return 'export.filter.activity.course_having_activity_between_date.Title'; return 'export.filter.activity.course_having_activity_between_date.Title';
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder $builder
->add('start_date', PickRollingDateType::class, [ ->add('start_date', PickRollingDateType::class, [
@@ -42,21 +41,6 @@ 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 public function getFormDefaultData(): array
{ {
return [ return [
@@ -65,7 +49,7 @@ final readonly class PeriodHavingActivityBetweenDatesFilter implements FilterInt
]; ];
} }
public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array public function describeAction($data, $format = 'string')
{ {
return [ return [
'export.filter.activity.course_having_activity_between_date.Only course having an activity between from and to', 'export.filter.activity.course_having_activity_between_date.Only course having an activity between from and to',
@@ -81,7 +65,7 @@ final readonly class PeriodHavingActivityBetweenDatesFilter implements FilterInt
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$alias = 'act_period_having_act_betw_date_alias'; $alias = 'act_period_having_act_betw_date_alias';
$from = 'act_period_having_act_betw_date_start'; $from = 'act_period_having_act_betw_date_start';
@@ -98,7 +82,7 @@ final readonly class PeriodHavingActivityBetweenDatesFilter implements FilterInt
->setParameter($to, $this->rollingDateConverter->convert($data['end_date'])); ->setParameter($to, $this->rollingDateConverter->convert($data['end_date']));
} }
public function applyOn(): string public function applyOn()
{ {
return \Chill\PersonBundle\Export\Declarations::ACP_TYPE; return \Chill\PersonBundle\Export\Declarations::ACP_TYPE;
} }

View File

@@ -12,7 +12,6 @@ declare(strict_types=1);
namespace Chill\ActivityBundle\Export\Filter; namespace Chill\ActivityBundle\Export\Filter;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Form\Type\PickRollingDateType; use Chill\MainBundle\Form\Type\PickRollingDateType;
use Chill\MainBundle\Service\RollingDate\RollingDate; use Chill\MainBundle\Service\RollingDate\RollingDate;
@@ -31,7 +30,7 @@ class ActivityDateFilter implements FilterInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$where = $qb->getDQLPart('where'); $where = $qb->getDQLPart('where');
$clause = $qb->expr()->between( $clause = $qb->expr()->between(
@@ -62,7 +61,7 @@ class ActivityDateFilter implements FilterInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder $builder
->add('date_from', PickRollingDateType::class, [ ->add('date_from', PickRollingDateType::class, [
@@ -73,27 +72,12 @@ 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 public function getFormDefaultData(): array
{ {
return ['date_from' => new RollingDate(RollingDate::T_YEAR_PREVIOUS_START), 'date_to' => new RollingDate(RollingDate::T_TODAY)]; return ['date_from' => new RollingDate(RollingDate::T_YEAR_PREVIOUS_START), 'date_to' => new RollingDate(RollingDate::T_TODAY)];
} }
public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array public function describeAction($data, $format = 'string')
{ {
return [ return [
'Filtered by date of activity: only between %date_from% and %date_to%', 'Filtered by date of activity: only between %date_from% and %date_to%',
@@ -104,7 +88,7 @@ class ActivityDateFilter implements FilterInterface
]; ];
} }
public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface public function getTitle()
{ {
return 'Filtered by date activity'; return 'Filtered by date activity';
} }

View File

@@ -13,8 +13,6 @@ namespace Chill\ActivityBundle\Export\Filter;
use Chill\ActivityBundle\Entity\ActivityPresence; use Chill\ActivityBundle\Entity\ActivityPresence;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\ActivityBundle\Repository\ActivityPresenceRepositoryInterface;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Templating\TranslatableStringHelperInterface; use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
@@ -25,20 +23,17 @@ use Symfony\Contracts\Translation\TranslatorInterface;
final readonly class ActivityPresenceFilter implements FilterInterface final readonly class ActivityPresenceFilter implements FilterInterface
{ {
use \Chill\MainBundle\Export\ExportDataNormalizerTrait;
public function __construct( public function __construct(
private TranslatableStringHelperInterface $translatableStringHelper, private TranslatableStringHelperInterface $translatableStringHelper,
private TranslatorInterface $translator, private TranslatorInterface $translator,
private ActivityPresenceRepositoryInterface $activityPresenceRepository,
) {} ) {}
public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface public function getTitle()
{ {
return 'export.filter.activity.by_presence.Filter activity by activity presence'; return 'export.filter.activity.by_presence.Filter activity by activity presence';
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder->add('presences', EntityType::class, [ $builder->add('presences', EntityType::class, [
'class' => ActivityPresence::class, 'class' => ActivityPresence::class,
@@ -50,27 +45,12 @@ 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array public function describeAction($data, $format = 'string')
{ {
$presences = array_map( $presences = array_map(
fn (ActivityPresence $presence) => $this->translatableStringHelper->localize($presence->getName()), fn (ActivityPresence $presence) => $this->translatableStringHelper->localize($presence->getName()),
@@ -88,14 +68,14 @@ final readonly class ActivityPresenceFilter implements FilterInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$qb $qb
->andWhere('activity.attendee IN (:activity_presence_filter_presences)') ->andWhere('activity.attendee IN (:activity_presence_filter_presences)')
->setParameter('activity_presence_filter_presences', $data['presences']); ->setParameter('activity_presence_filter_presences', $data['presences']);
} }
public function applyOn(): string public function applyOn()
{ {
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }

View File

@@ -15,7 +15,6 @@ use Chill\ActivityBundle\Entity\ActivityType;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\ActivityBundle\Repository\ActivityTypeRepositoryInterface; use Chill\ActivityBundle\Repository\ActivityTypeRepositoryInterface;
use Chill\MainBundle\Export\ExportElementValidatedInterface; use Chill\MainBundle\Export\ExportElementValidatedInterface;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Templating\TranslatableStringHelperInterface; use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
@@ -25,8 +24,6 @@ use Symfony\Component\Validator\Context\ExecutionContextInterface;
class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInterface class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInterface
{ {
use \Chill\MainBundle\Export\ExportDataNormalizerTrait;
public function __construct( public function __construct(
protected TranslatableStringHelperInterface $translatableStringHelper, protected TranslatableStringHelperInterface $translatableStringHelper,
protected ActivityTypeRepositoryInterface $activityTypeRepository, protected ActivityTypeRepositoryInterface $activityTypeRepository,
@@ -37,7 +34,7 @@ class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInter
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$clause = $qb->expr()->in('activity.activityType', ':selected_activity_types'); $clause = $qb->expr()->in('activity.activityType', ':selected_activity_types');
@@ -50,7 +47,7 @@ class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInter
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder->add('types', EntityType::class, [ $builder->add('types', EntityType::class, [
'choices' => $this->activityTypeRepository->findAllActive(), 'choices' => $this->activityTypeRepository->findAllActive(),
@@ -73,27 +70,12 @@ 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array public function describeAction($data, $format = 'string')
{ {
// collect all the reasons'name used in this filter in one array // collect all the reasons'name used in this filter in one array
$reasonsNames = array_map( $reasonsNames = array_map(
@@ -106,12 +88,12 @@ class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInter
]]; ]];
} }
public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface public function getTitle()
{ {
return 'Filter by activity type'; return 'Filter by activity type';
} }
public function validateForm($data, ExecutionContextInterface $context): void public function validateForm($data, ExecutionContextInterface $context)
{ {
if (null === $data['types'] || 0 === \count($data['types'])) { if (null === $data['types'] || 0 === \count($data['types'])) {
$context $context

View File

@@ -12,30 +12,26 @@ declare(strict_types=1);
namespace Chill\ActivityBundle\Export\Filter; namespace Chill\ActivityBundle\Export\Filter;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Form\Type\PickUserOrMeDynamicType; use Chill\MainBundle\Form\Type\PickUserDynamicType;
use Chill\MainBundle\Repository\UserRepositoryInterface;
use Chill\MainBundle\Templating\Entity\UserRender; use Chill\MainBundle\Templating\Entity\UserRender;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
final readonly class ActivityUsersFilter implements FilterInterface class ActivityUsersFilter implements FilterInterface
{ {
use \Chill\MainBundle\Export\ExportDataNormalizerTrait; public function __construct(private readonly UserRender $userRender) {}
public function __construct(private UserRender $userRender, private UserRepositoryInterface $userRepository) {}
public function addRole(): ?string public function addRole(): ?string
{ {
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$orX = $qb->expr()->orX(); $orX = $qb->expr()->orX();
foreach ($this->userOrMe($data['accepted_users'], $exportGenerationContext) as $key => $user) { foreach ($data['accepted_users'] as $key => $user) {
$orX->add($qb->expr()->isMemberOf(':activity_users_filter_u'.$key, 'activity.users')); $orX->add($qb->expr()->isMemberOf(':activity_users_filter_u'.$key, 'activity.users'));
$qb->setParameter('activity_users_filter_u'.$key, $user); $qb->setParameter('activity_users_filter_u'.$key, $user);
} }
@@ -43,44 +39,29 @@ final readonly class ActivityUsersFilter implements FilterInterface
$qb->andWhere($orX); $qb->andWhere($orX);
} }
public function applyOn(): string public function applyOn()
{ {
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder->add('accepted_users', PickUserOrMeDynamicType::class, [ $builder->add('accepted_users', PickUserDynamicType::class, [
'multiple' => true, 'multiple' => true,
'label' => 'Users', '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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array public function describeAction($data, $format = 'string')
{ {
$users = []; $users = [];
foreach ($this->userOrMe($data['accepted_users'], $context) as $u) { foreach ($data['accepted_users'] as $u) {
$users[] = $this->userRender->renderString($u, []); $users[] = $this->userRender->renderString($u, []);
} }

View File

@@ -12,32 +12,28 @@ declare(strict_types=1);
namespace Chill\ActivityBundle\Export\Filter; namespace Chill\ActivityBundle\Export\Filter;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Form\Type\PickUserOrMeDynamicType; use Chill\MainBundle\Form\Type\PickUserDynamicType;
use Chill\MainBundle\Repository\UserRepositoryInterface;
use Chill\MainBundle\Templating\Entity\UserRender; use Chill\MainBundle\Templating\Entity\UserRender;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
class ByCreatorFilter implements FilterInterface class ByCreatorFilter implements FilterInterface
{ {
use \Chill\MainBundle\Export\ExportDataNormalizerTrait; public function __construct(private readonly UserRender $userRender) {}
public function __construct(private readonly UserRender $userRender, private readonly UserRepositoryInterface $userRepository) {}
public function addRole(): ?string public function addRole(): ?string
{ {
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$qb $qb
->andWhere( ->andWhere(
$qb->expr()->in('activity.createdBy', ':users') $qb->expr()->in('activity.createdBy', ':users')
) )
->setParameter('users', $this->userOrMe($data['accepted_users'], $exportGenerationContext)); ->setParameter('users', $data['accepted_users']);
} }
public function applyOn(): string public function applyOn(): string
@@ -45,38 +41,23 @@ class ByCreatorFilter implements FilterInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder->add('accepted_users', PickUserOrMeDynamicType::class, [ $builder->add('accepted_users', PickUserDynamicType::class, [
'multiple' => true, '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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function describeAction($data, ExportGenerationContext $context): array public function describeAction($data, $format = 'string'): array
{ {
$users = []; $users = [];
foreach ($this->userOrMe($data['accepted_users'], $context) as $u) { foreach ($data['accepted_users'] as $u) {
$users[] = $this->userRender->renderString($u, []); $users[] = $this->userRender->renderString($u, []);
} }

View File

@@ -14,7 +14,6 @@ namespace Chill\ActivityBundle\Export\Filter;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\MainBundle\Entity\User\UserJobHistory; use Chill\MainBundle\Entity\User\UserJobHistory;
use Chill\MainBundle\Entity\UserJob; use Chill\MainBundle\Entity\UserJob;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Repository\UserJobRepositoryInterface; use Chill\MainBundle\Repository\UserJobRepositoryInterface;
use Chill\MainBundle\Templating\TranslatableStringHelper; use Chill\MainBundle\Templating\TranslatableStringHelper;
@@ -27,7 +26,6 @@ use Symfony\Contracts\Translation\TranslatorInterface;
final readonly class CreatorJobFilter implements FilterInterface final readonly class CreatorJobFilter implements FilterInterface
{ {
use \Chill\MainBundle\Export\ExportDataNormalizerTrait;
private const PREFIX = 'acp_act_filter_creator_job'; private const PREFIX = 'acp_act_filter_creator_job';
public function __construct( public function __construct(
@@ -41,7 +39,7 @@ final readonly class CreatorJobFilter implements FilterInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$p = self::PREFIX; $p = self::PREFIX;
@@ -77,7 +75,7 @@ final readonly class CreatorJobFilter implements FilterInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder $builder
->add('jobs', EntityType::class, [ ->add('jobs', EntityType::class, [
@@ -92,22 +90,7 @@ final readonly class CreatorJobFilter implements FilterInterface
]); ]);
} }
public function getNormalizationVersion(): int public function describeAction($data, $format = 'string'): array
{
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( $jobs = array_map(
fn (UserJob $job) => $this->translatableStringHelper->localize($job->getLabel()), fn (UserJob $job) => $this->translatableStringHelper->localize($job->getLabel()),

View File

@@ -14,7 +14,6 @@ namespace Chill\ActivityBundle\Export\Filter;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\MainBundle\Entity\Scope; use Chill\MainBundle\Entity\Scope;
use Chill\MainBundle\Entity\User\UserScopeHistory; use Chill\MainBundle\Entity\User\UserScopeHistory;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Repository\ScopeRepositoryInterface; use Chill\MainBundle\Repository\ScopeRepositoryInterface;
use Chill\MainBundle\Templating\TranslatableStringHelper; use Chill\MainBundle\Templating\TranslatableStringHelper;
@@ -25,7 +24,6 @@ use Symfony\Component\Form\FormBuilderInterface;
class CreatorScopeFilter implements FilterInterface class CreatorScopeFilter implements FilterInterface
{ {
use \Chill\MainBundle\Export\ExportDataNormalizerTrait;
private const PREFIX = 'acp_act_filter_creator_scope'; private const PREFIX = 'acp_act_filter_creator_scope';
public function __construct( public function __construct(
@@ -38,7 +36,7 @@ class CreatorScopeFilter implements FilterInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$p = self::PREFIX; $p = self::PREFIX;
@@ -74,7 +72,7 @@ class CreatorScopeFilter implements FilterInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder $builder
->add('scopes', EntityType::class, [ ->add('scopes', EntityType::class, [
@@ -88,22 +86,7 @@ class CreatorScopeFilter implements FilterInterface
]); ]);
} }
public function getNormalizationVersion(): int public function describeAction($data, $format = 'string'): array
{
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 = []; $scopes = [];

View File

@@ -12,7 +12,6 @@ declare(strict_types=1);
namespace Chill\ActivityBundle\Export\Filter; namespace Chill\ActivityBundle\Export\Filter;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Doctrine\ORM\Query\Expr\Andx; use Doctrine\ORM\Query\Expr\Andx;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
@@ -36,7 +35,7 @@ class EmergencyFilter implements FilterInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$where = $qb->getDQLPart('where'); $where = $qb->getDQLPart('where');
@@ -57,7 +56,7 @@ class EmergencyFilter implements FilterInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder->add('accepted_emergency', ChoiceType::class, [ $builder->add('accepted_emergency', ChoiceType::class, [
'choices' => self::CHOICES, 'choices' => self::CHOICES,
@@ -67,27 +66,12 @@ 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 public function getFormDefaultData(): array
{ {
return ['accepted_emergency' => self::DEFAULT_CHOICE]; return ['accepted_emergency' => self::DEFAULT_CHOICE];
} }
public function describeAction($data, ExportGenerationContext $context): array public function describeAction($data, $format = 'string'): array
{ {
return [ return [
'Filtered by emergency: only %emergency%', [ 'Filtered by emergency: only %emergency%', [

View File

@@ -12,27 +12,19 @@ declare(strict_types=1);
namespace Chill\ActivityBundle\Export\Filter; namespace Chill\ActivityBundle\Export\Filter;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Form\Type\PickUserLocationType; use Chill\MainBundle\Form\Type\PickUserLocationType;
use Chill\MainBundle\Repository\LocationRepository;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
final readonly class LocationFilter implements FilterInterface class LocationFilter implements FilterInterface
{ {
use \Chill\MainBundle\Export\ExportDataNormalizerTrait;
public function __construct(
private LocationRepository $locationRepository,
) {}
public function addRole(): ?string public function addRole(): ?string
{ {
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$qb->andWhere( $qb->andWhere(
$qb->expr()->in('activity.location', ':location') $qb->expr()->in('activity.location', ':location')
@@ -46,7 +38,7 @@ final readonly class LocationFilter implements FilterInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder->add('accepted_location', PickUserLocationType::class, [ $builder->add('accepted_location', PickUserLocationType::class, [
'multiple' => true, 'multiple' => true,
@@ -54,27 +46,12 @@ final readonly 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function describeAction($data, ExportGenerationContext $context): array public function describeAction($data, $format = 'string'): array
{ {
$locations = []; $locations = [];

View File

@@ -12,11 +12,8 @@ declare(strict_types=1);
namespace Chill\ActivityBundle\Export\Filter; namespace Chill\ActivityBundle\Export\Filter;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\MainBundle\Export\ExportDataNormalizerTrait;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Form\Type\PickLocationTypeType; use Chill\MainBundle\Form\Type\PickLocationTypeType;
use Chill\MainBundle\Repository\LocationTypeRepository;
use Chill\MainBundle\Templating\TranslatableStringHelper; use Chill\MainBundle\Templating\TranslatableStringHelper;
use Doctrine\ORM\Query\Expr\Andx; use Doctrine\ORM\Query\Expr\Andx;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
@@ -24,16 +21,14 @@ use Symfony\Component\Form\FormBuilderInterface;
class LocationTypeFilter implements FilterInterface class LocationTypeFilter implements FilterInterface
{ {
use ExportDataNormalizerTrait; public function __construct(private readonly TranslatableStringHelper $translatableStringHelper) {}
public function __construct(private readonly TranslatableStringHelper $translatableStringHelper, private LocationTypeRepository $locationTypeRepository) {}
public function addRole(): ?string public function addRole(): ?string
{ {
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
if (!\in_array('actloc', $qb->getAllAliases(), true)) { if (!\in_array('actloc', $qb->getAllAliases(), true)) {
$qb->join('activity.location', 'actloc'); $qb->join('activity.location', 'actloc');
@@ -57,7 +52,7 @@ class LocationTypeFilter implements FilterInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder->add('accepted_locationtype', PickLocationTypeType::class, [ $builder->add('accepted_locationtype', PickLocationTypeType::class, [
'multiple' => true, 'multiple' => true,
@@ -65,27 +60,12 @@ class LocationTypeFilter implements FilterInterface
]); ]);
} }
public function getNormalizationVersion(): int
{
return 1;
}
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 public function getFormDefaultData(): array
{ {
return ['accepted_locationtype' => []]; return [];
} }
public function describeAction($data, ExportGenerationContext $context): array public function describeAction($data, $format = 'string'): array
{ {
$types = []; $types = [];

View File

@@ -15,7 +15,6 @@ use Chill\ActivityBundle\Entity\ActivityReason;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\ActivityBundle\Repository\ActivityReasonRepository; use Chill\ActivityBundle\Repository\ActivityReasonRepository;
use Chill\MainBundle\Export\ExportElementValidatedInterface; use Chill\MainBundle\Export\ExportElementValidatedInterface;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Templating\TranslatableStringHelper; use Chill\MainBundle\Templating\TranslatableStringHelper;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
@@ -27,8 +26,6 @@ use Symfony\Component\Validator\Context\ExecutionContextInterface;
class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInterface class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInterface
{ {
use \Chill\MainBundle\Export\ExportDataNormalizerTrait;
public function __construct(protected TranslatableStringHelper $translatableStringHelper, protected ActivityReasonRepository $activityReasonRepository) {} public function __construct(protected TranslatableStringHelper $translatableStringHelper, protected ActivityReasonRepository $activityReasonRepository) {}
public function addRole(): ?string public function addRole(): ?string
@@ -36,7 +33,7 @@ class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInt
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$where = $qb->getDQLPart('where'); $where = $qb->getDQLPart('where');
$join = $qb->getDQLPart('join'); $join = $qb->getDQLPart('join');
@@ -61,7 +58,7 @@ class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInt
return Declarations::ACTIVITY_PERSON; return Declarations::ACTIVITY_PERSON;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder->add('reasons', EntityType::class, [ $builder->add('reasons', EntityType::class, [
'class' => ActivityReason::class, 'class' => ActivityReason::class,
@@ -73,27 +70,12 @@ 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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array public function describeAction($data, $format = 'string')
{ {
// collect all the reasons'name used in this filter in one array // collect all the reasons'name used in this filter in one array
$reasonsNames = array_map( $reasonsNames = array_map(
@@ -109,12 +91,12 @@ class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInt
]; ];
} }
public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface public function getTitle()
{ {
return 'Filter by reason'; return 'Filter by reason';
} }
public function validateForm($data, ExecutionContextInterface $context): void public function validateForm($data, ExecutionContextInterface $context)
{ {
if (null === $data['reasons'] || 0 === \count($data['reasons'])) { if (null === $data['reasons'] || 0 === \count($data['reasons'])) {
$context $context

View File

@@ -15,7 +15,6 @@ use Chill\ActivityBundle\Entity\Activity;
use Chill\ActivityBundle\Entity\ActivityReason; use Chill\ActivityBundle\Entity\ActivityReason;
use Chill\ActivityBundle\Repository\ActivityReasonRepository; use Chill\ActivityBundle\Repository\ActivityReasonRepository;
use Chill\MainBundle\Export\ExportElementValidatedInterface; use Chill\MainBundle\Export\ExportElementValidatedInterface;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Form\Type\PickRollingDateType; use Chill\MainBundle\Form\Type\PickRollingDateType;
use Chill\MainBundle\Service\RollingDate\RollingDate; use Chill\MainBundle\Service\RollingDate\RollingDate;
@@ -40,7 +39,7 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data): void
{ {
// create a subquery for activity // create a subquery for activity
$sqb = $qb->getEntityManager()->createQueryBuilder(); $sqb = $qb->getEntityManager()->createQueryBuilder();
@@ -93,7 +92,7 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem
return Declarations::PERSON_TYPE; return Declarations::PERSON_TYPE;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder->add('date_from_rolling', PickRollingDateType::class, [ $builder->add('date_from_rolling', PickRollingDateType::class, [
'label' => 'export.filter.activity.person_between_dates.Implied in an activity after this date', 'label' => 'export.filter.activity.person_between_dates.Implied in an activity after this date',
@@ -117,21 +116,6 @@ 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 public function getFormDefaultData(): array
{ {
return [ return [
@@ -141,7 +125,7 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem
]; ];
} }
public function describeAction($data, ExportGenerationContext $context): array public function describeAction($data, $format = 'string'): array
{ {
return [ return [
[] === $data['reasons'] ? [] === $data['reasons'] ?
@@ -166,7 +150,7 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem
return 'export.filter.activity.person_between_dates.title'; return 'export.filter.activity.person_between_dates.title';
} }
public function validateForm($data, ExecutionContextInterface $context): void public function validateForm($data, ExecutionContextInterface $context)
{ {
if ($this->rollingDateConverter->convert($data['date_from_rolling']) if ($this->rollingDateConverter->convert($data['date_from_rolling'])
>= $this->rollingDateConverter->convert($data['date_to_rolling'])) { >= $this->rollingDateConverter->convert($data['date_to_rolling'])) {

View File

@@ -13,7 +13,6 @@ namespace Chill\ActivityBundle\Export\Filter;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\ActivityBundle\Tests\Export\Filter\PersonsFilterTest; use Chill\ActivityBundle\Tests\Export\Filter\PersonsFilterTest;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\PersonBundle\Form\Type\PickPersonDynamicType; use Chill\PersonBundle\Form\Type\PickPersonDynamicType;
use Chill\PersonBundle\Templating\Entity\PersonRenderInterface; use Chill\PersonBundle\Templating\Entity\PersonRenderInterface;
@@ -34,7 +33,7 @@ final readonly class PersonsFilter implements FilterInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$p = self::PREFIX; $p = self::PREFIX;
@@ -48,12 +47,12 @@ final readonly class PersonsFilter implements FilterInterface
$qb->andWhere($orX); $qb->andWhere($orX);
} }
public function applyOn(): string public function applyOn()
{ {
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder->add('accepted_persons', PickPersonDynamicType::class, [ $builder->add('accepted_persons', PickPersonDynamicType::class, [
'multiple' => true, 'multiple' => true,
@@ -61,21 +60,6 @@ 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 public function getFormDefaultData(): array
{ {
return [ return [
@@ -83,7 +67,7 @@ final readonly class PersonsFilter implements FilterInterface
]; ];
} }
public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array public function describeAction($data, $format = 'string')
{ {
$users = []; $users = [];

View File

@@ -13,7 +13,6 @@ namespace Chill\ActivityBundle\Export\Filter;
use Chill\ActivityBundle\Entity\Activity; use Chill\ActivityBundle\Entity\Activity;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Doctrine\ORM\Query\Expr\Andx; use Doctrine\ORM\Query\Expr\Andx;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
@@ -37,7 +36,7 @@ class SentReceivedFilter implements FilterInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$where = $qb->getDQLPart('where'); $where = $qb->getDQLPart('where');
@@ -58,7 +57,7 @@ class SentReceivedFilter implements FilterInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder->add('accepted_sentreceived', ChoiceType::class, [ $builder->add('accepted_sentreceived', ChoiceType::class, [
'choices' => self::CHOICES, 'choices' => self::CHOICES,
@@ -69,27 +68,12 @@ 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 public function getFormDefaultData(): array
{ {
return ['accepted_sentreceived' => self::DEFAULT_CHOICE]; return ['accepted_sentreceived' => self::DEFAULT_CHOICE];
} }
public function describeAction($data, ExportGenerationContext $context): array public function describeAction($data, $format = 'string'): array
{ {
$sentreceived = array_flip(self::CHOICES)[$data['accepted_sentreceived']]; $sentreceived = array_flip(self::CHOICES)[$data['accepted_sentreceived']];

View File

@@ -12,27 +12,23 @@ declare(strict_types=1);
namespace Chill\ActivityBundle\Export\Filter; namespace Chill\ActivityBundle\Export\Filter;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Form\Type\PickUserOrMeDynamicType; use Chill\MainBundle\Form\Type\PickUserDynamicType;
use Chill\MainBundle\Repository\UserRepositoryInterface;
use Chill\MainBundle\Templating\Entity\UserRender; use Chill\MainBundle\Templating\Entity\UserRender;
use Doctrine\ORM\Query\Expr\Andx; use Doctrine\ORM\Query\Expr\Andx;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
final readonly class UserFilter implements FilterInterface class UserFilter implements FilterInterface
{ {
use \Chill\MainBundle\Export\ExportDataNormalizerTrait; public function __construct(private readonly UserRender $userRender) {}
public function __construct(private UserRender $userRender, private UserRepositoryInterface $userRepository) {}
public function addRole(): ?string public function addRole(): ?string
{ {
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$where = $qb->getDQLPart('where'); $where = $qb->getDQLPart('where');
@@ -45,7 +41,7 @@ final readonly class UserFilter implements FilterInterface
} }
$qb->add('where', $where); $qb->add('where', $where);
$qb->setParameter('users', $this->userOrMe($data['accepted_users'], $exportGenerationContext)); $qb->setParameter('users', $data['accepted_users']);
} }
public function applyOn(): string public function applyOn(): string
@@ -53,39 +49,24 @@ final readonly class UserFilter implements FilterInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder->add('accepted_users', PickUserOrMeDynamicType::class, [ $builder->add('accepted_users', PickUserDynamicType::class, [
'multiple' => true, 'multiple' => true,
'label' => 'Creators', '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 public function getFormDefaultData(): array
{ {
return []; return [];
} }
public function describeAction($data, ExportGenerationContext $context): array public function describeAction($data, $format = 'string'): array
{ {
$users = []; $users = [];
foreach ($this->userOrMe($data['accepted_users'], $context) as $u) { foreach ($data['accepted_users'] as $u) {
$users[] = $this->userRender->renderString($u, []); $users[] = $this->userRender->renderString($u, []);
} }

View File

@@ -15,7 +15,6 @@ use Chill\ActivityBundle\Entity\Activity;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\MainBundle\Entity\User\UserJobHistory; use Chill\MainBundle\Entity\User\UserJobHistory;
use Chill\MainBundle\Entity\UserJob; use Chill\MainBundle\Entity\UserJob;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Repository\UserJobRepositoryInterface; use Chill\MainBundle\Repository\UserJobRepositoryInterface;
use Chill\MainBundle\Templating\TranslatableStringHelperInterface; use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
@@ -26,7 +25,6 @@ use Symfony\Component\Form\FormBuilderInterface;
class UsersJobFilter implements FilterInterface class UsersJobFilter implements FilterInterface
{ {
use \Chill\MainBundle\Export\ExportDataNormalizerTrait;
private const PREFIX = 'act_filter_user_job'; private const PREFIX = 'act_filter_user_job';
public function __construct( public function __construct(
@@ -39,7 +37,7 @@ class UsersJobFilter implements FilterInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$p = self::PREFIX; $p = self::PREFIX;
@@ -62,12 +60,12 @@ class UsersJobFilter implements FilterInterface
); );
} }
public function applyOn(): string public function applyOn()
{ {
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder $builder
->add('jobs', EntityType::class, [ ->add('jobs', EntityType::class, [
@@ -79,22 +77,7 @@ class UsersJobFilter implements FilterInterface
]); ]);
} }
public function getNormalizationVersion(): int public function describeAction($data, $format = 'string')
{
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): string|\Symfony\Contracts\Translation\TranslatableInterface|array
{ {
return ['export.filter.activity.by_users_job.Filtered activity by users job: only %jobs%', [ return ['export.filter.activity.by_users_job.Filtered activity by users job: only %jobs%', [
'%jobs%' => implode( '%jobs%' => implode(
@@ -114,7 +97,7 @@ class UsersJobFilter implements FilterInterface
]; ];
} }
public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface public function getTitle()
{ {
return 'export.filter.activity.by_users_job.Filter by users job'; return 'export.filter.activity.by_users_job.Filter by users job';
} }

View File

@@ -15,7 +15,6 @@ use Chill\ActivityBundle\Entity\Activity;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\MainBundle\Entity\Scope; use Chill\MainBundle\Entity\Scope;
use Chill\MainBundle\Entity\User\UserScopeHistory; use Chill\MainBundle\Entity\User\UserScopeHistory;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Repository\ScopeRepositoryInterface; use Chill\MainBundle\Repository\ScopeRepositoryInterface;
use Chill\MainBundle\Templating\TranslatableStringHelperInterface; use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
@@ -26,7 +25,6 @@ use Symfony\Component\Form\FormBuilderInterface;
class UsersScopeFilter implements FilterInterface class UsersScopeFilter implements FilterInterface
{ {
use \Chill\MainBundle\Export\ExportDataNormalizerTrait;
private const PREFIX = 'act_filter_user_scope'; private const PREFIX = 'act_filter_user_scope';
public function __construct( public function __construct(
@@ -39,7 +37,7 @@ class UsersScopeFilter implements FilterInterface
return null; return null;
} }
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data)
{ {
$p = self::PREFIX; $p = self::PREFIX;
@@ -67,7 +65,7 @@ class UsersScopeFilter implements FilterInterface
return Declarations::ACTIVITY; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder $builder
->add('scopes', EntityType::class, [ ->add('scopes', EntityType::class, [
@@ -79,22 +77,7 @@ class UsersScopeFilter implements FilterInterface
]); ]);
} }
public function getNormalizationVersion(): int public function describeAction($data, $format = 'string'): array
{
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
{ {
return ['export.filter.activity.by_users_scope.Filtered activity by users scope: only %scopes%', [ return ['export.filter.activity.by_users_scope.Filtered activity by users scope: only %scopes%', [
'%scopes%' => implode( '%scopes%' => implode(

View File

@@ -12,9 +12,8 @@ declare(strict_types=1);
namespace Chill\ActivityBundle\Repository; namespace Chill\ActivityBundle\Repository;
use Chill\ActivityBundle\Entity\ActivityPresence; use Chill\ActivityBundle\Entity\ActivityPresence;
use Doctrine\Persistence\ObjectRepository;
interface ActivityPresenceRepositoryInterface extends ObjectRepository interface ActivityPresenceRepositoryInterface
{ {
public function find($id): ?ActivityPresence; public function find($id): ?ActivityPresence;

View File

@@ -136,8 +136,8 @@ export default {
issueIsLoading: false, issueIsLoading: false,
actionIsLoading: false, actionIsLoading: false,
actionAreLoaded: false, actionAreLoaded: false,
socialIssuesClassList: `col-form-label ${document.querySelector("input#chill_activitybundle_activity_socialIssues").getAttribute("required") ? "required" : ""}`, socialIssuesClassList: 'col-form-label',
socialActionsClassList: `col-form-label ${document.querySelector("input#chill_activitybundle_activity_socialActions").getAttribute("required") ? "required" : ""}`, socialActionsClassList: 'col-form-label',
}; };
}, },
computed: { computed: {
@@ -158,6 +158,17 @@ export default {
}, },
}, },
mounted() { mounted() {
/* Load classNames after element is present */
const socialActionsEl = document.querySelector("input#chill_activitybundle_activity_socialActions");
if (socialActionsEl && socialActionsEl.hasAttribute("required")) {
this.socialActionsClassList += ' required';
}
const socialIssuessEl = document.querySelector("input#chill_activitybundle_activity_socialIssues");
if (socialIssuessEl && socialIssuessEl.hasAttribute("required")) {
this.socialIssuesClassList += ' required';
}
/* Load other issues in multiselect */ /* Load other issues in multiselect */
this.issueIsLoading = true; this.issueIsLoading = true;
this.actionAreLoaded = false; this.actionAreLoaded = false;

View File

@@ -2,7 +2,7 @@ import "es6-promise/auto";
import { createStore } from "vuex"; import { createStore } from "vuex";
import { postLocation } from "./api"; import { postLocation } from "./api";
import prepareLocations from "./store.locations.js"; import prepareLocations from "./store.locations.js";
import { fetchResults, makeFetch } from "ChillMainAssets/lib/api/apiMethods"; import { makeFetch } from "ChillMainAssets/lib/api/apiMethods";
const debug = process.env.NODE_ENV !== "production"; const debug = process.env.NODE_ENV !== "production";
//console.log('window.activity', window.activity); //console.log('window.activity', window.activity);
@@ -365,11 +365,11 @@ const store = createStore({
const accompanyingPeriodId = state.activity.accompanyingPeriod.id; const accompanyingPeriodId = state.activity.accompanyingPeriod.id;
const url = `/api/1.0/person/accompanying-course/${accompanyingPeriodId}/works.json`; const url = `/api/1.0/person/accompanying-course/${accompanyingPeriodId}/works.json`;
try { try {
const works = await fetchResults(url); const works = await makeFetch("GET", url);
// console.log('works', works); // console.log("works", works);
commit("setAccompanyingPeriodWorks", works); commit("setAccompanyingPeriodWorks", works);
} catch (error) { } catch (error) {
console.error("Failed to fetch works:", error); console.error("Failed to fetch accompanying period works:", error);
} }
}, },
getWhoAmI({ commit }) { getWhoAmI({ commit }) {

View File

@@ -3,7 +3,7 @@
{% block admin_content %} {% block admin_content %}
<h1>{{ 'ActivityReason list'|trans }}</h1> <h1>{{ 'ActivityReason list'|trans }}</h1>
<table class="table table-bordered border-dark align-middle"> <table class="records_list">
<thead> <thead>
<tr> <tr>
<th>{{ 'Name'|trans }}</th> <th>{{ 'Name'|trans }}</th>
@@ -29,7 +29,10 @@
<td> <td>
<ul class="record_actions"> <ul class="record_actions">
<li> <li>
<a href="{{ path('chill_activity_activityreason_update', { 'id': entity.id }) }}" class="btn btn-edit" title="{{ 'edit'|trans }}"></a> <a href="{{ path('chill_activity_activityreason_show', { 'id': entity.id }) }}" class="btn btn-show" title="{{ 'show'|trans }}"></a>
</li>
<li>
<a href="{{ path('chill_activity_activityreason_edit', { 'id': entity.id }) }}" class="btn btn-edit" title="{{ 'edit'|trans }}"></a>
</li> </li>
</ul> </ul>
</td> </td>

View File

@@ -3,7 +3,7 @@
{% block admin_content %} {% block admin_content %}
<h1>{{ 'ActivityReasonCategory list'|trans }}</h1> <h1>{{ 'ActivityReasonCategory list'|trans }}</h1>
<table class="table table-bordered border-dark align-middle"> <table class="records_list">
<thead> <thead>
<tr> <tr>
<th>{{ 'Name'|trans }}</th> <th>{{ 'Name'|trans }}</th>
@@ -23,7 +23,10 @@
<td> <td>
<ul class="record_actions"> <ul class="record_actions">
<li> <li>
<a href="{{ path('chill_activity_activityreasoncategory_update', { 'id': entity.id }) }}" class="btn btn-edit" title="{{ 'edit'|trans }}"></a> <a href="{{ path('chill_activity_activityreasoncategory_show', { 'id': entity.id }) }}" class="btn btn-show" title="{{ 'show'|trans }}"></a>
</li>
<li>
<a href="{{ path('chill_activity_activityreasoncategory_edit', { 'id': entity.id }) }}" class="btn btn-edit" title="{{ 'edit'|trans }}"></a>
</li> </li>
</ul> </ul>
</td> </td>

View File

@@ -22,52 +22,6 @@ use Symfony\Component\Security\Core\Role\Role;
*/ */
final class ActivityControllerTest extends WebTestCase final class ActivityControllerTest extends WebTestCase
{ {
/**
* @dataProvider getSecuredPagesUnauthenticated
*/
public function testAccessIsDeniedForUnauthenticated(mixed $url)
{
$client = $this->createClient();
$client->request('GET', $url);
$this->assertEquals(302, $client->getResponse()->getStatusCode());
$this->assertTrue(
$client->getResponse()->isRedirect('http://localhost/login'),
sprintf('the page "%s" does not redirect to http://localhost/login', $url)
);
}
/**
* Provide a client unauthenticated and.
*/
public function getSecuredPagesUnauthenticated()
{
self::bootKernel();
$person = $this->getPersonFromFixtures();
$activities = $this->getActivitiesForPerson($person);
return [
[sprintf('fr/person/%d/activity/', $person->getId())],
[sprintf('fr/person/%d/activity/new', $person->getId())],
[sprintf('fr/person/%d/activity/%d/show', $person->getId(), $activities[0]->getId())],
[sprintf('fr/person/%d/activity/%d/edit', $person->getId(), $activities[0]->getId())],
];
}
/**
* @dataProvider getSecuredPagesAuthenticated
*
* @param type $client
* @param type $url
*/
public function testAccessIsDeniedForUnauthorized($client, $url)
{
$client->request('GET', $url);
$this->assertEquals(403, $client->getResponse()->getStatusCode());
}
public function getSecuredPagesAuthenticated() public function getSecuredPagesAuthenticated()
{ {
self::bootKernel(); self::bootKernel();
@@ -101,6 +55,52 @@ final class ActivityControllerTest extends WebTestCase
]; ];
} }
/**
* Provide a client unauthenticated and.
*/
public function getSecuredPagesUnauthenticated()
{
self::bootKernel();
$person = $this->getPersonFromFixtures();
$activities = $this->getActivitiesForPerson($person);
return [
[sprintf('fr/person/%d/activity/', $person->getId())],
[sprintf('fr/person/%d/activity/new', $person->getId())],
[sprintf('fr/person/%d/activity/%d/show', $person->getId(), $activities[0]->getId())],
[sprintf('fr/person/%d/activity/%d/edit', $person->getId(), $activities[0]->getId())],
];
}
/**
* @dataProvider getSecuredPagesUnauthenticated
*/
public function testAccessIsDeniedForUnauthenticated(mixed $url)
{
$client = $this->createClient();
$client->request('GET', $url);
$this->assertEquals(302, $client->getResponse()->getStatusCode());
$this->assertTrue(
$client->getResponse()->isRedirect('http://localhost/login'),
sprintf('the page "%s" does not redirect to http://localhost/login', $url)
);
}
/**
* @dataProvider getSecuredPagesAuthenticated
*
* @param type $client
* @param type $url
*/
public function testAccessIsDeniedForUnauthorized($client, $url)
{
$client->request('GET', $url);
$this->assertEquals(403, $client->getResponse()->getStatusCode());
}
public function testCompleteScenario() public function testCompleteScenario()
{ {
// Create a new client to browse the application // Create a new client to browse the application

Some files were not shown because too many files have changed in this diff Show More