Feature: allow filtering activities in docgen for acc course by logged user

This commit is contained in:
nobohan 2023-03-16 10:43:01 +01:00
parent 331443ae12
commit bf79e0afdb

View File

@ -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];