From bf79e0afdbb9bd3842440ca2a1a4ef39285658a9 Mon Sep 17 00:00:00 2001 From: nobohan Date: Thu, 16 Mar 2023 10:43:01 +0100 Subject: [PATCH 01/13] Feature: allow filtering activities in docgen for acc course by logged user --- ...tActivitiesByAccompanyingPeriodContext.php | 34 ++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php index 7e1873710..17e566133 100644 --- a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php +++ b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php @@ -11,6 +11,7 @@ declare(strict_types=1); namespace Chill\ActivityBundle\Service\DocGenerator; +use Chill\ActivityBundle\Entity\Activity; use Chill\ActivityBundle\Entity\ActivityPresence; use Chill\ActivityBundle\Entity\ActivityType; use Chill\ActivityBundle\Repository\ActivityACLAwareRepositoryInterface; @@ -37,6 +38,8 @@ use libphonenumber\PhoneNumber; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; +use Symfony\Component\Form\Extension\Core\Type\CheckboxType; +use Symfony\Component\Security\Core\Security; class ListActivitiesByAccompanyingPeriodContext implements DocGeneratorContextWithAdminFormInterface, @@ -60,6 +63,8 @@ class ListActivitiesByAccompanyingPeriodContext implements private UserRepository $userRepository; + private Security $security; + public function __construct( AccompanyingPeriodContext $accompanyingPeriodContext, ActivityACLAwareRepositoryInterface $activityACLAwareRepository, @@ -69,7 +74,8 @@ class ListActivitiesByAccompanyingPeriodContext implements SocialIssueRepository $socialIssueRepository, ThirdPartyRepository $thirdPartyRepository, TranslatableStringHelperInterface $translatableStringHelper, - UserRepository $userRepository + UserRepository $userRepository, + Security $security ) { $this->accompanyingPeriodContext = $accompanyingPeriodContext; $this->activityACLAwareRepository = $activityACLAwareRepository; @@ -80,6 +86,7 @@ class ListActivitiesByAccompanyingPeriodContext implements $this->thirdPartyRepository = $thirdPartyRepository; $this->translatableStringHelper = $translatableStringHelper; $this->userRepository = $userRepository; + $this->security = $security; } public function adminFormReverseTransform(array $data): array @@ -95,6 +102,12 @@ class ListActivitiesByAccompanyingPeriodContext implements public function buildAdminForm(FormBuilderInterface $builder): void { $this->accompanyingPeriodContext->buildAdminForm($builder); + + $builder + ->add('myActivityOnly', CheckboxType::class, [ + 'required' => false, + 'label' => 'docgen.myActivityOnly', + ]); } public function buildPublicForm(FormBuilderInterface $builder, DocGeneratorTemplate $template, $entity): void @@ -104,9 +117,9 @@ class ListActivitiesByAccompanyingPeriodContext implements public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array { + $myActivityOnly = $template->getOptions()['myActivityOnly']; $data = $this->accompanyingPeriodContext->getData($template, $entity, $contextGenerationData); - - $data['activities'] = $this->getActivitiesSimplified($entity); + $data['activities'] = $this->getActivitiesSimplified($entity, $myActivityOnly); return $data; } @@ -161,12 +174,25 @@ class ListActivitiesByAccompanyingPeriodContext implements $this->accompanyingPeriodContext->storeGenerated($template, $storedObject, $entity, $contextGenerationData); } - private function getActivitiesSimplified(AccompanyingPeriod $period) + private function getActivitiesSimplified(AccompanyingPeriod $period, bool $myActivityOnly) { $activities = $this->activityACLAwareRepository->findByAccompanyingPeriodSimplified($period); $results = []; + if ($myActivityOnly) { + $activities = array_filter( + $activities, + function ($activity) { + $activity_usernames = array_map(function ($userId) { + return $this->userRepository->findOneBy(['id' => $userId])->getUsername(); + }, $activity['userIds'] ?? []); + + return in_array($this->security->getUser()->getUsername(), $activity_usernames); + } + ); + } + foreach ($activities as $row) { $activity = $row[0]; From 9ded3eb6314921f33b6d0e462622b804aa90fc8f Mon Sep 17 00:00:00 2001 From: nobohan Date: Thu, 16 Mar 2023 14:29:51 +0100 Subject: [PATCH 02/13] Feature: allow filtering works in docgen for acc course by logged user --- ...tActivitiesByAccompanyingPeriodContext.php | 67 ++++++++++++++----- 1 file changed, 49 insertions(+), 18 deletions(-) diff --git a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php index 17e566133..55dfca728 100644 --- a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php +++ b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php @@ -104,9 +104,13 @@ class ListActivitiesByAccompanyingPeriodContext implements $this->accompanyingPeriodContext->buildAdminForm($builder); $builder - ->add('myActivityOnly', CheckboxType::class, [ + ->add('myActivitiesOnly', CheckboxType::class, [ 'required' => false, - 'label' => 'docgen.myActivityOnly', + 'label' => 'docgen.myActivitiesOnly', + ]) + ->add('myWorksOnly', CheckboxType::class, [ + 'required' => false, + 'label' => 'docgen.myWorksOnly', ]); } @@ -117,13 +121,53 @@ class ListActivitiesByAccompanyingPeriodContext implements public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array { - $myActivityOnly = $template->getOptions()['myActivityOnly']; $data = $this->accompanyingPeriodContext->getData($template, $entity, $contextGenerationData); - $data['activities'] = $this->getActivitiesSimplified($entity, $myActivityOnly); + + $activities = $this->getActivitiesSimplified($entity); + + $myActivitiesOnly = $template->getOptions()['myActivitiesOnly']; + if ($myActivitiesOnly) { + $activities = $this->filterActivitiesByCurrentUser($activities); + } + + $data['activities'] = $activities; + + $myWorksOnly = $template->getOptions()['myWorksOnly']; + if ($myWorksOnly) { + $data['course']['works'] = $this->filterWorksByCurrentUser($data['course']['works']); + } return $data; } + public function filterWorksByCurrentUser(array $works): array + { + return array_filter( + $works, + function ($work) { + $workUsernames = array_map(function ($user) { + return $user['username']; + }, $work['referrers'] ?? []); + return in_array($this->security->getUser()->getUsername(), $workUsernames); + } + ); + } + + + public function filterActivitiesByCurrentUser(array $activities): array + { + return array_filter( + $activities, + function ($activity) { + $activityUsernames = array_map(function ($user) { + return $user['username']; + }, $activity['users'] ?? []); + return in_array($this->security->getUser()->getUsername(), $activityUsernames); + } + ); + } + + public function getDescription(): string { return 'docgen.Accompanying period with a list of activities description'; @@ -174,25 +218,12 @@ class ListActivitiesByAccompanyingPeriodContext implements $this->accompanyingPeriodContext->storeGenerated($template, $storedObject, $entity, $contextGenerationData); } - private function getActivitiesSimplified(AccompanyingPeriod $period, bool $myActivityOnly) + private function getActivitiesSimplified(AccompanyingPeriod $period) { $activities = $this->activityACLAwareRepository->findByAccompanyingPeriodSimplified($period); $results = []; - if ($myActivityOnly) { - $activities = array_filter( - $activities, - function ($activity) { - $activity_usernames = array_map(function ($userId) { - return $this->userRepository->findOneBy(['id' => $userId])->getUsername(); - }, $activity['userIds'] ?? []); - - return in_array($this->security->getUser()->getUsername(), $activity_usernames); - } - ); - } - foreach ($activities as $row) { $activity = $row[0]; From 5bba1aca9372a3e677dae00bff0aafa4e9187e97 Mon Sep 17 00:00:00 2001 From: nobohan Date: Thu, 16 Mar 2023 14:33:09 +0100 Subject: [PATCH 03/13] Feature: allow filtering works in docgen for acc course by logged user - php cs fixer --- ...tActivitiesByAccompanyingPeriodContext.php | 90 ++++++++++--------- 1 file changed, 46 insertions(+), 44 deletions(-) diff --git a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php index 55dfca728..2a5b2f81e 100644 --- a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php +++ b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php @@ -11,7 +11,6 @@ declare(strict_types=1); namespace Chill\ActivityBundle\Service\DocGenerator; -use Chill\ActivityBundle\Entity\Activity; use Chill\ActivityBundle\Entity\ActivityPresence; use Chill\ActivityBundle\Entity\ActivityType; use Chill\ActivityBundle\Repository\ActivityACLAwareRepositoryInterface; @@ -35,11 +34,12 @@ use Chill\ThirdPartyBundle\Entity\ThirdParty; use Chill\ThirdPartyBundle\Repository\ThirdPartyRepository; use DateTime; use libphonenumber\PhoneNumber; +use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Component\Security\Core\Security; use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; -use Symfony\Component\Form\Extension\Core\Type\CheckboxType; -use Symfony\Component\Security\Core\Security; +use function in_array; class ListActivitiesByAccompanyingPeriodContext implements DocGeneratorContextWithAdminFormInterface, @@ -53,6 +53,8 @@ class ListActivitiesByAccompanyingPeriodContext implements private PersonRepository $personRepository; + private Security $security; + private SocialActionRepository $socialActionRepository; private SocialIssueRepository $socialIssueRepository; @@ -63,8 +65,6 @@ class ListActivitiesByAccompanyingPeriodContext implements private UserRepository $userRepository; - private Security $security; - public function __construct( AccompanyingPeriodContext $accompanyingPeriodContext, ActivityACLAwareRepositoryInterface $activityACLAwareRepository, @@ -119,25 +119,28 @@ class ListActivitiesByAccompanyingPeriodContext implements $this->accompanyingPeriodContext->buildPublicForm($builder, $template, $entity); } - public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array + public function contextGenerationDataDenormalize(DocGeneratorTemplate $template, $entity, array $data): array { - $data = $this->accompanyingPeriodContext->getData($template, $entity, $contextGenerationData); + return $this->accompanyingPeriodContext->contextGenerationDataDenormalize($template, $entity, $data); + } - $activities = $this->getActivitiesSimplified($entity); + public function contextGenerationDataNormalize(DocGeneratorTemplate $template, $entity, array $data): array + { + return $this->accompanyingPeriodContext->contextGenerationDataNormalize($template, $entity, $data); + } - $myActivitiesOnly = $template->getOptions()['myActivitiesOnly']; - if ($myActivitiesOnly) { - $activities = $this->filterActivitiesByCurrentUser($activities); - } + public function filterActivitiesByCurrentUser(array $activities): array + { + return array_filter( + $activities, + function ($activity) { + $activityUsernames = array_map(static function ($user) { + return $user['username']; + }, $activity['users'] ?? []); - $data['activities'] = $activities; - - $myWorksOnly = $template->getOptions()['myWorksOnly']; - if ($myWorksOnly) { - $data['course']['works'] = $this->filterWorksByCurrentUser($data['course']['works']); - } - - return $data; + return in_array($this->security->getUser()->getUsername(), $activityUsernames, true); + } + ); } public function filterWorksByCurrentUser(array $works): array @@ -145,28 +148,37 @@ class ListActivitiesByAccompanyingPeriodContext implements return array_filter( $works, function ($work) { - $workUsernames = array_map(function ($user) { + $workUsernames = array_map(static function ($user) { return $user['username']; }, $work['referrers'] ?? []); - return in_array($this->security->getUser()->getUsername(), $workUsernames); + + return in_array($this->security->getUser()->getUsername(), $workUsernames, true); } ); } - - public function filterActivitiesByCurrentUser(array $activities): array + public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array { - return array_filter( - $activities, - function ($activity) { - $activityUsernames = array_map(function ($user) { - return $user['username']; - }, $activity['users'] ?? []); - return in_array($this->security->getUser()->getUsername(), $activityUsernames); - } - ); - } + $data = $this->accompanyingPeriodContext->getData($template, $entity, $contextGenerationData); + $activities = $this->getActivitiesSimplified($entity); + + $myActivitiesOnly = $template->getOptions()['myActivitiesOnly']; + + if ($myActivitiesOnly) { + $activities = $this->filterActivitiesByCurrentUser($activities); + } + + $data['activities'] = $activities; + + $myWorksOnly = $template->getOptions()['myWorksOnly']; + + if ($myWorksOnly) { + $data['course']['works'] = $this->filterWorksByCurrentUser($data['course']['works']); + } + + return $data; + } public function getDescription(): string { @@ -203,16 +215,6 @@ class ListActivitiesByAccompanyingPeriodContext implements return $this->accompanyingPeriodContext->hasPublicForm($template, $entity); } - public function contextGenerationDataNormalize(DocGeneratorTemplate $template, $entity, array $data): array - { - return $this->accompanyingPeriodContext->contextGenerationDataNormalize($template, $entity, $data); - } - - public function contextGenerationDataDenormalize(DocGeneratorTemplate $template, $entity, array $data): array - { - return $this->accompanyingPeriodContext->contextGenerationDataDenormalize($template, $entity, $data); - } - public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void { $this->accompanyingPeriodContext->storeGenerated($template, $storedObject, $entity, $contextGenerationData); From 1167ff25b115e84bf814efdb49ba25c2c161a71f Mon Sep 17 00:00:00 2001 From: nobohan Date: Thu, 16 Mar 2023 16:02:26 +0100 Subject: [PATCH 04/13] Feature: allow filtering for users in the public form for docgen acc course --- ...tActivitiesByAccompanyingPeriodContext.php | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php index 2a5b2f81e..db3b5bd92 100644 --- a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php +++ b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php @@ -103,6 +103,21 @@ class ListActivitiesByAccompanyingPeriodContext implements { $this->accompanyingPeriodContext->buildAdminForm($builder); + // $builder + // ->add('myActivitiesOnly', CheckboxType::class, [ + // 'required' => false, + // 'label' => 'docgen.myActivitiesOnly', + // ]) + // ->add('myWorksOnly', CheckboxType::class, [ + // 'required' => false, + // 'label' => 'docgen.myWorksOnly', + // ]); + } + + public function buildPublicForm(FormBuilderInterface $builder, DocGeneratorTemplate $template, $entity): void + { + $this->accompanyingPeriodContext->buildPublicForm($builder, $template, $entity); + $builder ->add('myActivitiesOnly', CheckboxType::class, [ 'required' => false, @@ -114,11 +129,6 @@ class ListActivitiesByAccompanyingPeriodContext implements ]); } - public function buildPublicForm(FormBuilderInterface $builder, DocGeneratorTemplate $template, $entity): void - { - $this->accompanyingPeriodContext->buildPublicForm($builder, $template, $entity); - } - public function contextGenerationDataDenormalize(DocGeneratorTemplate $template, $entity, array $data): array { return $this->accompanyingPeriodContext->contextGenerationDataDenormalize($template, $entity, $data); @@ -126,7 +136,12 @@ class ListActivitiesByAccompanyingPeriodContext implements public function contextGenerationDataNormalize(DocGeneratorTemplate $template, $entity, array $data): array { - return $this->accompanyingPeriodContext->contextGenerationDataNormalize($template, $entity, $data); + $normalized = $this->accompanyingPeriodContext->contextGenerationDataNormalize($template, $entity, $data); + foreach (['myActivitiesOnly', 'myWorksOnly'] as $k) { + $normalized[$k] = null !== ($data[$k] ?? null) ? $data[$k] : false; + } + + return $normalized; } public function filterActivitiesByCurrentUser(array $activities): array @@ -163,7 +178,7 @@ class ListActivitiesByAccompanyingPeriodContext implements $activities = $this->getActivitiesSimplified($entity); - $myActivitiesOnly = $template->getOptions()['myActivitiesOnly']; + $myActivitiesOnly = $contextGenerationData['myActivitiesOnly']; if ($myActivitiesOnly) { $activities = $this->filterActivitiesByCurrentUser($activities); @@ -171,12 +186,11 @@ class ListActivitiesByAccompanyingPeriodContext implements $data['activities'] = $activities; - $myWorksOnly = $template->getOptions()['myWorksOnly']; + $myWorksOnly = $contextGenerationData['myWorksOnly']; if ($myWorksOnly) { $data['course']['works'] = $this->filterWorksByCurrentUser($data['course']['works']); } - return $data; } @@ -212,7 +226,7 @@ class ListActivitiesByAccompanyingPeriodContext implements public function hasPublicForm(DocGeneratorTemplate $template, $entity): bool { - return $this->accompanyingPeriodContext->hasPublicForm($template, $entity); + return true; } public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void From 3927a7f62b2f81d6cef28d886d73ca35647310fb Mon Sep 17 00:00:00 2001 From: nobohan Date: Thu, 16 Mar 2023 16:10:09 +0100 Subject: [PATCH 05/13] Feature: allow filtering for users in the public form for docgen acc course - php code fix --- .../DocGenerator/ListActivitiesByAccompanyingPeriodContext.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php index db3b5bd92..46fe56d96 100644 --- a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php +++ b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php @@ -137,6 +137,7 @@ class ListActivitiesByAccompanyingPeriodContext implements public function contextGenerationDataNormalize(DocGeneratorTemplate $template, $entity, array $data): array { $normalized = $this->accompanyingPeriodContext->contextGenerationDataNormalize($template, $entity, $data); + foreach (['myActivitiesOnly', 'myWorksOnly'] as $k) { $normalized[$k] = null !== ($data[$k] ?? null) ? $data[$k] : false; } @@ -191,6 +192,7 @@ class ListActivitiesByAccompanyingPeriodContext implements if ($myWorksOnly) { $data['course']['works'] = $this->filterWorksByCurrentUser($data['course']['works']); } + return $data; } From 801853e60a4227f676b8bbb2ef6d9088c1cbcc70 Mon Sep 17 00:00:00 2001 From: nobohan Date: Thu, 16 Mar 2023 16:11:03 +0100 Subject: [PATCH 06/13] Feature: translation for docgen + php cs fix --- .../Service/DocGenerator/ActivityContext.php | 55 ++++++++++--------- .../translations/messages.fr.yml | 2 + 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ActivityContext.php b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ActivityContext.php index 01b7e2945..d577fd911 100644 --- a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ActivityContext.php +++ b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ActivityContext.php @@ -147,6 +147,32 @@ class ActivityContext implements } } + public function contextGenerationDataDenormalize(DocGeneratorTemplate $template, $entity, array $data): array + { + $denormalized = []; + + foreach (['mainPerson', 'person1', 'person2'] as $k) { + if (null !== ($id = ($data[$k] ?? null))) { + $denormalized[$k] = $this->personRepository->find($id); + } else { + $denormalized[$k] = null; + } + } + + return $denormalized; + } + + public function contextGenerationDataNormalize(DocGeneratorTemplate $template, $entity, array $data): array + { + $normalized = []; + + foreach (['mainPerson', 'person1', 'person2'] as $k) { + $normalized[$k] = null === $data[$k] ? null : $data[$k]->getId(); + } + + return $normalized; + } + public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array { if (!$entity instanceof Activity) { @@ -214,32 +240,9 @@ class ActivityContext implements return $options['mainPerson'] || $options['person1'] || $options['person2']; } - public function contextGenerationDataNormalize(DocGeneratorTemplate $template, $entity, array $data): array - { - $normalized = []; - - foreach (['mainPerson', 'person1', 'person2'] as $k) { - $normalized[$k] = null === $data[$k] ? null : $data[$k]->getId(); - } - - return $normalized; - } - - public function contextGenerationDataDenormalize(DocGeneratorTemplate $template, $entity, array $data): array - { - $denormalized = []; - - foreach (['mainPerson', 'person1', 'person2'] as $k) { - if (null !== ($id = ($data[$k] ?? null))) { - $denormalized[$k] = $this->personRepository->find($id); - } else { - $denormalized[$k] = null; - } - } - - return $denormalized; - } - + /** + * @param Activity $entity + */ public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void { $storedObject->setTitle($this->translatableStringHelper->localize($template->getName())); diff --git a/src/Bundle/ChillActivityBundle/translations/messages.fr.yml b/src/Bundle/ChillActivityBundle/translations/messages.fr.yml index 4dd67ceb8..2afb1779a 100644 --- a/src/Bundle/ChillActivityBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillActivityBundle/translations/messages.fr.yml @@ -329,6 +329,8 @@ docgen: A basic context for activity: Contexte pour les activités Accompanying period with a list of activities: Parcours d'accompagnement avec liste des activités Accompanying period with a list of activities description: Ce contexte reprend les informations du parcours, et tous les activités pour un parcours. Les activités ne sont pas filtrés. + myActivitiesOnly: Prendre en compte uniquement les échanges dans lesquels je suis intervenu + myWorksOnly: Prendre en compte uniquement les actions d'accompagnement dont je suis référent export: list: From f3ede8122d428632428a80f276dffc6ba1578803 Mon Sep 17 00:00:00 2001 From: nobohan Date: Thu, 23 Mar 2023 21:10:00 +0100 Subject: [PATCH 07/13] remove commented lines --- .../ListActivitiesByAccompanyingPeriodContext.php | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php index 46fe56d96..edcbaac82 100644 --- a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php +++ b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php @@ -102,16 +102,6 @@ class ListActivitiesByAccompanyingPeriodContext implements public function buildAdminForm(FormBuilderInterface $builder): void { $this->accompanyingPeriodContext->buildAdminForm($builder); - - // $builder - // ->add('myActivitiesOnly', CheckboxType::class, [ - // 'required' => false, - // 'label' => 'docgen.myActivitiesOnly', - // ]) - // ->add('myWorksOnly', CheckboxType::class, [ - // 'required' => false, - // 'label' => 'docgen.myWorksOnly', - // ]); } public function buildPublicForm(FormBuilderInterface $builder, DocGeneratorTemplate $template, $entity): void From 03fe9210a9367b68f9d8b7a72f68e646a52bfcdf Mon Sep 17 00:00:00 2001 From: nobohan Date: Thu, 23 Mar 2023 21:16:54 +0100 Subject: [PATCH 08/13] upd CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b2f951479..72cd0e666 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to ## Unreleased +* [activity] Feature: In docgen, allow filtering activities and social works for acc course by logged user * [person][export] Fixed: rename the alias for `accompanying_period` to `acp` in filter associated with person * [activity][export] Feature: improve label for aliases in "Filter by activity type" * [activity][export] DX/Feature: use of an `ActivityTypeRepositoryInterface` instead of the old-style EntityRepository From 6d6aa689d0755cd454219335230ffdc569f4bc90 Mon Sep 17 00:00:00 2001 From: nobohan Date: Wed, 29 Mar 2023 22:05:36 +0200 Subject: [PATCH 09/13] Feature: filter activities by user in docgen: use creator as user --- CHANGELOG.md | 1 - ...tActivitiesByAccompanyingPeriodContext.php | 19 ++++++++----------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 72cd0e666..b2f951479 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,6 @@ and this project adheres to ## Unreleased -* [activity] Feature: In docgen, allow filtering activities and social works for acc course by logged user * [person][export] Fixed: rename the alias for `accompanying_period` to `acp` in filter associated with person * [activity][export] Feature: improve label for aliases in "Filter by activity type" * [activity][export] DX/Feature: use of an `ActivityTypeRepositoryInterface` instead of the old-style EntityRepository diff --git a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php index edcbaac82..50714e811 100644 --- a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php +++ b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php @@ -135,30 +135,29 @@ class ListActivitiesByAccompanyingPeriodContext implements return $normalized; } - public function filterActivitiesByCurrentUser(array $activities): array + public function filterActivitiesByUser(array $activities, User $user): array { return array_filter( $activities, - function ($activity) { + function ($activity) use ($user) { $activityUsernames = array_map(static function ($user) { return $user['username']; }, $activity['users'] ?? []); - - return in_array($this->security->getUser()->getUsername(), $activityUsernames, true); + return in_array($user->getUsername(), $activityUsernames, true); } ); } - public function filterWorksByCurrentUser(array $works): array + public function filterWorksByUser(array $works, User $user): array { return array_filter( $works, - function ($work) { + function ($work) use ($user) { $workUsernames = array_map(static function ($user) { return $user['username']; }, $work['referrers'] ?? []); - return in_array($this->security->getUser()->getUsername(), $workUsernames, true); + return in_array($user->getUsername(), $workUsernames, true); } ); } @@ -168,11 +167,10 @@ class ListActivitiesByAccompanyingPeriodContext implements $data = $this->accompanyingPeriodContext->getData($template, $entity, $contextGenerationData); $activities = $this->getActivitiesSimplified($entity); - $myActivitiesOnly = $contextGenerationData['myActivitiesOnly']; if ($myActivitiesOnly) { - $activities = $this->filterActivitiesByCurrentUser($activities); + $activities = $this->filterActivitiesByUser($activities, $contextGenerationData['creator']); } $data['activities'] = $activities; @@ -180,9 +178,8 @@ class ListActivitiesByAccompanyingPeriodContext implements $myWorksOnly = $contextGenerationData['myWorksOnly']; if ($myWorksOnly) { - $data['course']['works'] = $this->filterWorksByCurrentUser($data['course']['works']); + $data['course']['works'] = $this->filterWorksByUser($data['course']['works'], $contextGenerationData['creator']); } - return $data; } From c9f26f363502e6febe1a468afa951b43957561aa Mon Sep 17 00:00:00 2001 From: nobohan Date: Wed, 29 Mar 2023 22:12:59 +0200 Subject: [PATCH 10/13] Feature: filter activities by user: add denormalize method --- .../ListActivitiesByAccompanyingPeriodContext.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php index 50714e811..f1951978c 100644 --- a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php +++ b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php @@ -121,7 +121,14 @@ class ListActivitiesByAccompanyingPeriodContext implements public function contextGenerationDataDenormalize(DocGeneratorTemplate $template, $entity, array $data): array { - return $this->accompanyingPeriodContext->contextGenerationDataDenormalize($template, $entity, $data); + + $denormalized = $this->accompanyingPeriodContext->contextGenerationDataDenormalize($template, $entity, $data); + + foreach (['myActivitiesOnly', 'myWorksOnly'] as $k) { + $denormalized[$k] = $data[$k]; + } + + return $denormalized; } public function contextGenerationDataNormalize(DocGeneratorTemplate $template, $entity, array $data): array From 2a4b73457bccc70cabb47e6ca927f38325dd0104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 12 Apr 2023 17:48:02 +0200 Subject: [PATCH 11/13] DX: fix phpstan issues --- .../Service/DocGenerator/ActivityContext.php | 3 -- ...tActivitiesByAccompanyingPeriodContext.php | 4 --- .../Service/DocGenerator/CalendarContext.php | 12 +------ .../DocGenerator/CalendarContextInterface.php | 33 ++----------------- ...GeneratorContextWithAdminFormInterface.php | 4 +++ ...eneratorContextWithPublicFormInterface.php | 3 +- 6 files changed, 10 insertions(+), 49 deletions(-) diff --git a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ActivityContext.php b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ActivityContext.php index d577fd911..ad570a8a4 100644 --- a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ActivityContext.php +++ b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ActivityContext.php @@ -240,9 +240,6 @@ class ActivityContext implements return $options['mainPerson'] || $options['person1'] || $options['person2']; } - /** - * @param Activity $entity - */ public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void { $storedObject->setTitle($this->translatableStringHelper->localize($template->getName())); diff --git a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php index f1951978c..e10ee3da4 100644 --- a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php +++ b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php @@ -53,8 +53,6 @@ class ListActivitiesByAccompanyingPeriodContext implements private PersonRepository $personRepository; - private Security $security; - private SocialActionRepository $socialActionRepository; private SocialIssueRepository $socialIssueRepository; @@ -75,7 +73,6 @@ class ListActivitiesByAccompanyingPeriodContext implements ThirdPartyRepository $thirdPartyRepository, TranslatableStringHelperInterface $translatableStringHelper, UserRepository $userRepository, - Security $security ) { $this->accompanyingPeriodContext = $accompanyingPeriodContext; $this->activityACLAwareRepository = $activityACLAwareRepository; @@ -86,7 +83,6 @@ class ListActivitiesByAccompanyingPeriodContext implements $this->thirdPartyRepository = $thirdPartyRepository; $this->translatableStringHelper = $translatableStringHelper; $this->userRepository = $userRepository; - $this->security = $security; } public function adminFormReverseTransform(array $data): array diff --git a/src/Bundle/ChillCalendarBundle/Service/DocGenerator/CalendarContext.php b/src/Bundle/ChillCalendarBundle/Service/DocGenerator/CalendarContext.php index f5b244027..cabb7dcce 100644 --- a/src/Bundle/ChillCalendarBundle/Service/DocGenerator/CalendarContext.php +++ b/src/Bundle/ChillCalendarBundle/Service/DocGenerator/CalendarContext.php @@ -31,8 +31,6 @@ use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; use function count; -/** - */ final class CalendarContext implements CalendarContextInterface { private BaseContextData $baseContextData; @@ -150,10 +148,8 @@ final class CalendarContext implements CalendarContextInterface } /** - * param array{mainPerson?: Person, thirdParty?: ThirdParty, title: string} $contextGenerationData - * @param mixed $entity */ - public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array + public function getData(DocGeneratorTemplate $template, mixed $entity, array $contextGenerationData = []): array { $options = $this->getOptions($template); @@ -274,9 +270,6 @@ final class CalendarContext implements CalendarContextInterface return $denormalized; } - /** - * param array{mainPerson?: Person, thirdParty?: ThirdParty, title: string} $contextGenerationData - */ public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void { $options = $this->getOptions($template); @@ -287,9 +280,6 @@ final class CalendarContext implements CalendarContextInterface $this->entityManager->persist($doc); } - /** - * return array{askMainPerson: bool, mainPersonLabel: ?string, askThirdParty: bool, thirdPartyLabel: ?string, trackDateTime: bool} $options - */ private function getOptions(DocGeneratorTemplate $template): array { return $template->getOptions(); diff --git a/src/Bundle/ChillCalendarBundle/Service/DocGenerator/CalendarContextInterface.php b/src/Bundle/ChillCalendarBundle/Service/DocGenerator/CalendarContextInterface.php index 4ae85d33a..527203003 100644 --- a/src/Bundle/ChillCalendarBundle/Service/DocGenerator/CalendarContextInterface.php +++ b/src/Bundle/ChillCalendarBundle/Service/DocGenerator/CalendarContextInterface.php @@ -12,6 +12,7 @@ declare(strict_types=1); namespace Chill\CalendarBundle\Service\DocGenerator; use Chill\CalendarBundle\Entity\Calendar; +use Chill\DocGeneratorBundle\Context\DocGeneratorContextInterface; use Chill\DocGeneratorBundle\Context\DocGeneratorContextWithAdminFormInterface; use Chill\DocGeneratorBundle\Context\DocGeneratorContextWithPublicFormInterface; use Chill\DocGeneratorBundle\Entity\DocGeneratorTemplate; @@ -19,37 +20,9 @@ use Chill\DocStoreBundle\Entity\StoredObject; use Symfony\Component\Form\FormBuilderInterface; /** - * @template-extends DocGeneratorContextWithPublicFormInterface + * @extends DocGeneratorContextWithPublicFormInterface + * @extends DocGeneratorContextWithAdminFormInterface */ interface CalendarContextInterface extends DocGeneratorContextWithPublicFormInterface, DocGeneratorContextWithAdminFormInterface { - public function adminFormReverseTransform(array $data): array; - - public function adminFormTransform(array $data): array; - - public function buildAdminForm(FormBuilderInterface $builder): void; - - public function buildPublicForm(FormBuilderInterface $builder, DocGeneratorTemplate $template, $entity): void; - - public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array; - - public function getDescription(): string; - - public function getEntityClass(): string; - - public function getFormData(DocGeneratorTemplate $template, $entity): array; - - public static function getKey(): string; - - public function getName(): string; - - public function hasAdminForm(): bool; - - public function hasPublicForm(DocGeneratorTemplate $template, $entity): bool; - - public function contextGenerationDataNormalize(DocGeneratorTemplate $template, $entity, array $data): array; - - public function contextGenerationDataDenormalize(DocGeneratorTemplate $template, $entity, array $data): array; - - public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void; } diff --git a/src/Bundle/ChillDocGeneratorBundle/Context/DocGeneratorContextWithAdminFormInterface.php b/src/Bundle/ChillDocGeneratorBundle/Context/DocGeneratorContextWithAdminFormInterface.php index 4707bf398..732d4b796 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Context/DocGeneratorContextWithAdminFormInterface.php +++ b/src/Bundle/ChillDocGeneratorBundle/Context/DocGeneratorContextWithAdminFormInterface.php @@ -13,6 +13,10 @@ namespace Chill\DocGeneratorBundle\Context; use Symfony\Component\Form\FormBuilderInterface; +/** + * @template T of object + * @extends DocGeneratorContextInterface + */ interface DocGeneratorContextWithAdminFormInterface extends DocGeneratorContextInterface { public function adminFormReverseTransform(array $data): array; diff --git a/src/Bundle/ChillDocGeneratorBundle/Context/DocGeneratorContextWithPublicFormInterface.php b/src/Bundle/ChillDocGeneratorBundle/Context/DocGeneratorContextWithPublicFormInterface.php index a60a35123..496524206 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Context/DocGeneratorContextWithPublicFormInterface.php +++ b/src/Bundle/ChillDocGeneratorBundle/Context/DocGeneratorContextWithPublicFormInterface.php @@ -15,7 +15,8 @@ use Chill\DocGeneratorBundle\Entity\DocGeneratorTemplate; use Symfony\Component\Form\FormBuilderInterface; /** - * @template T + * @template T of object + * @extends DocGeneratorContextInterface */ interface DocGeneratorContextWithPublicFormInterface extends DocGeneratorContextInterface { From d0830079da1b1ed0a2a943ab83393519d7ffc8ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 12 Apr 2023 18:17:48 +0200 Subject: [PATCH 12/13] DX: fix generation in test mode --- ...istActivitiesByAccompanyingPeriodContext.php | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php index e10ee3da4..266fadfee 100644 --- a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php +++ b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php @@ -36,11 +36,14 @@ use DateTime; use libphonenumber\PhoneNumber; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\FormBuilderInterface; -use Symfony\Component\Security\Core\Security; use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; use function in_array; +/** + * @implements DocGeneratorContextWithPublicFormInterface + * @implements DocGeneratorContextWithAdminFormInterface + */ class ListActivitiesByAccompanyingPeriodContext implements DocGeneratorContextWithAdminFormInterface, DocGeneratorContextWithPublicFormInterface @@ -132,13 +135,13 @@ class ListActivitiesByAccompanyingPeriodContext implements $normalized = $this->accompanyingPeriodContext->contextGenerationDataNormalize($template, $entity, $data); foreach (['myActivitiesOnly', 'myWorksOnly'] as $k) { - $normalized[$k] = null !== ($data[$k] ?? null) ? $data[$k] : false; + $normalized[$k] = $data[$k] ?? false; } return $normalized; } - public function filterActivitiesByUser(array $activities, User $user): array + private function filterActivitiesByUser(array $activities, User $user): array { return array_filter( $activities, @@ -151,7 +154,7 @@ class ListActivitiesByAccompanyingPeriodContext implements ); } - public function filterWorksByUser(array $works, User $user): array + private function filterWorksByUser(array $works, User $user): array { return array_filter( $works, @@ -165,14 +168,14 @@ class ListActivitiesByAccompanyingPeriodContext implements ); } - public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array + public function getData(DocGeneratorTemplate $template, object $entity, array $contextGenerationData = []): array { $data = $this->accompanyingPeriodContext->getData($template, $entity, $contextGenerationData); $activities = $this->getActivitiesSimplified($entity); $myActivitiesOnly = $contextGenerationData['myActivitiesOnly']; - if ($myActivitiesOnly) { + if ($myActivitiesOnly && isset($contextGenerationData['creator'])) { $activities = $this->filterActivitiesByUser($activities, $contextGenerationData['creator']); } @@ -180,7 +183,7 @@ class ListActivitiesByAccompanyingPeriodContext implements $myWorksOnly = $contextGenerationData['myWorksOnly']; - if ($myWorksOnly) { + if ($myWorksOnly && isset($contextGenerationData['creator'])) { $data['course']['works'] = $this->filterWorksByUser($data['course']['works'], $contextGenerationData['creator']); } return $data; From a553dc9aab8684682a40ffa4b4e690be948f5b65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 12 Apr 2023 18:18:08 +0200 Subject: [PATCH 13/13] =?UTF-8?q?UI:=20fix=20replacement=20Activit=C3=A9?= =?UTF-8?q?=20=3D>=20=C3=A9change=20in=20french=20translations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Bundle/ChillActivityBundle/translations/messages.fr.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Bundle/ChillActivityBundle/translations/messages.fr.yml b/src/Bundle/ChillActivityBundle/translations/messages.fr.yml index c90478785..b64635f69 100644 --- a/src/Bundle/ChillActivityBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillActivityBundle/translations/messages.fr.yml @@ -326,9 +326,9 @@ This is the minimal activity data: Activité n° docgen: Activity basic: Echange - A basic context for activity: Contexte pour les activités - Accompanying period with a list of activities: Parcours d'accompagnement avec liste des activités - Accompanying period with a list of activities description: Ce contexte reprend les informations du parcours, et tous les activités pour un parcours. Les activités ne sont pas filtrés. + A basic context for activity: Contexte pour les échanges + Accompanying period with a list of activities: Parcours d'accompagnement avec liste des échanges + Accompanying period with a list of activities description: Ce contexte reprend les informations du parcours, et tous les échanges pour un parcours. Les échanges ne sont pas filtrés. myActivitiesOnly: Prendre en compte uniquement les échanges dans lesquels je suis intervenu myWorksOnly: Prendre en compte uniquement les actions d'accompagnement dont je suis référent