mirror of
				https://gitlab.com/Chill-Projet/chill-bundles.git
				synced 2025-10-31 17:28:23 +00:00 
			
		
		
		
	FEATURE [activity][filter] filter form created to list activities within the parcours and person context
This commit is contained in:
		| @@ -13,6 +13,7 @@ namespace Chill\ActivityBundle\Controller; | ||||
|  | ||||
| use Chill\ActivityBundle\Entity\Activity; | ||||
| use Chill\ActivityBundle\Entity\ActivityReason; | ||||
| use Chill\ActivityBundle\Form\ActivityFilterType; | ||||
| use Chill\ActivityBundle\Form\ActivityType; | ||||
| use Chill\ActivityBundle\Repository\ActivityACLAwareRepositoryInterface; | ||||
| use Chill\ActivityBundle\Repository\ActivityRepository; | ||||
| @@ -294,6 +295,10 @@ final class ActivityController extends AbstractController | ||||
|  | ||||
|         [$person, $accompanyingPeriod] = $this->getEntity($request); | ||||
|  | ||||
|         $form = $this->createForm(ActivityFilterType::class); | ||||
|  | ||||
|         $form->handleRequest($request); | ||||
|  | ||||
|         if ($person instanceof Person) { | ||||
|             $this->denyAccessUnlessGranted(ActivityVoter::SEE, $person); | ||||
|             $activities = $this->activityACLAwareRepository | ||||
| @@ -307,6 +312,7 @@ final class ActivityController extends AbstractController | ||||
|  | ||||
|             $view = 'ChillActivityBundle:Activity:listPerson.html.twig'; | ||||
|         } elseif ($accompanyingPeriod instanceof AccompanyingPeriod) { | ||||
|  | ||||
|             $this->denyAccessUnlessGranted(ActivityVoter::SEE, $accompanyingPeriod); | ||||
|  | ||||
|             $activities = $this->activityACLAwareRepository | ||||
| @@ -315,9 +321,12 @@ final class ActivityController extends AbstractController | ||||
|             $view = 'ChillActivityBundle:Activity:listAccompanyingCourse.html.twig'; | ||||
|         } | ||||
|  | ||||
|  | ||||
|  | ||||
|         return $this->render( | ||||
|             $view, | ||||
|             [ | ||||
|                 'form' => $form->createView(), | ||||
|                 'activities' => $activities, | ||||
|                 'person' => $person, | ||||
|                 'accompanyingCourse' => $accompanyingPeriod, | ||||
|   | ||||
							
								
								
									
										107
									
								
								src/Bundle/ChillActivityBundle/Form/ActivityFilterType.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								src/Bundle/ChillActivityBundle/Form/ActivityFilterType.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,107 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Chill\ActivityBundle\Form; | ||||
|  | ||||
| use Chill\MainBundle\Entity\UserJob; | ||||
| use Chill\MainBundle\Form\Type\ChillDateType; | ||||
| use Chill\MainBundle\Templating\TranslatableStringHelperInterface; | ||||
| use Doctrine\ORM\EntityRepository; | ||||
| use Symfony\Bridge\Doctrine\Form\Type\EntityType; | ||||
| use Symfony\Component\Form\AbstractType; | ||||
| use Symfony\Component\Form\Extension\Core\Type\CheckboxType; | ||||
| use Symfony\Component\Form\FormBuilderInterface; | ||||
| use Symfony\Component\Form\FormError; | ||||
| use Symfony\Component\Form\FormEvent; | ||||
| use Symfony\Component\Form\FormEvents; | ||||
| use Symfony\Component\OptionsResolver\OptionsResolver; | ||||
| use Symfony\Contracts\Translation\TranslatorInterface; | ||||
| use Chill\ActivityBundle\Entity\ActivityType; | ||||
|  | ||||
| class ActivityFilterType extends AbstractType | ||||
| { | ||||
|     private TranslatableStringHelperInterface $translatableString; | ||||
|  | ||||
|     protected TranslatorInterface $translator; | ||||
|  | ||||
|     public function __construct(TranslatableStringHelperInterface $translatableString, TranslatorInterface $translator) | ||||
|     { | ||||
|         $this->translatableString = $translatableString; | ||||
|  | ||||
|         $this->translator = $translator; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder, array $options): void | ||||
|     { | ||||
|  | ||||
|         $builder | ||||
|             ->add('types', EntityType::class, [ | ||||
|                 'class' => ActivityType::class, | ||||
|                 'label' => 'Activity type', | ||||
|                 'multiple' => true, | ||||
|                 'query_builder' => static function (EntityRepository $er) { | ||||
|                     $qb = $er->createQueryBuilder('t'); | ||||
|                     $qb->andWhere($qb->expr()->eq('t.active', "'TRUE'")); | ||||
|  | ||||
|                     return $qb; | ||||
|                 }, | ||||
|                 'choice_label' => function (ActivityType $t) { | ||||
|                     return $this->translatableString->localize($t->getName()); | ||||
|                 }, | ||||
|                 'required' => false, | ||||
|             ]) | ||||
|             ->add('jobs', EntityType::class, [ | ||||
|                 'class' => UserJob::class, | ||||
|                 'label' => 'user job', | ||||
|                 'multiple' => true, | ||||
|                 'query_builder' => static function (EntityRepository $er) { | ||||
|                     $qb = $er->createQueryBuilder('j'); | ||||
|                     $qb->andWhere($qb->expr()->eq('j.active', "'TRUE'")); | ||||
|  | ||||
|                     return $qb; | ||||
|                 }, | ||||
|                 'choice_label' => function (UserJob $j) { | ||||
|                     return $this->translatableString->localize($j->getLabel()); | ||||
|                 }, | ||||
|                 'required' => false, | ||||
|             ]) | ||||
|             ->add('dateFrom', ChillDateType::class, [ | ||||
|                 'label' => 'Activities after this date', | ||||
|                 'required' => false, | ||||
|             ]) | ||||
|             ->add('dateTo', ChillDateType::class, [ | ||||
|                 'label' => 'Activities before this date', | ||||
|                 'required' => false, | ||||
|             ]) | ||||
|             ->add('onlyMe', CheckboxType::class, [ | ||||
|                 'label' => 'My activities only', | ||||
|                 'required' => false, | ||||
|             ]); | ||||
|  | ||||
|         $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) { | ||||
|  | ||||
|             $form = $event->getForm(); | ||||
|             $dateFrom = $form->get('dateFrom')->getData(); | ||||
|             $dateTo = $form->get('dateTo')->getData(); | ||||
|  | ||||
|             // check that date_from is before date_to | ||||
|             if ( | ||||
|                 (null !== $dateFrom && null !== $dateTo) | ||||
|                 && $dateFrom >= $dateTo | ||||
|             ) { | ||||
|                 $form->get('dateTo')->addError(new FormError( | ||||
|                     $this->translator->trans('This date should be after ' | ||||
|                         . 'the date given in "Implied in an activity after ' | ||||
|                         . 'this date" field') | ||||
|                 )); | ||||
|             } | ||||
|  | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     public function configureOptions(OptionsResolver $resolver): void | ||||
|     { | ||||
|         $resolver->setDefaults([ | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -27,7 +27,48 @@ | ||||
|         {% set accompanying_course_id = accompanyingCourse.id %} | ||||
|     {% endif %} | ||||
|  | ||||
|     <h1>{{ 'Activity list' |trans }}</h1> | ||||
|     <h1>{{ 'Activity list'|trans }}</h1> | ||||
|  | ||||
| {#    <div class="col-10">#} | ||||
|  | ||||
|         {{ form_start(form) }} | ||||
|         <div class="row"> | ||||
|             <div class="col-md-4"> | ||||
|                 {{ form_label(form.types ) }} | ||||
|                 {{ form_widget(form.types, {'attr': {'class': 'select2'}}) }} | ||||
|             </div> | ||||
|             <div class="col-md-4"> | ||||
|                 {{ form_label(form.jobs) }} | ||||
|                 {{ form_widget(form.jobs, {'attr': {'class': 'select2'}}) }} | ||||
|             </div> | ||||
|             <div class="row"> | ||||
|                 <div class="col-md-4"> | ||||
|                     {{ form_label(form.dateFrom) }} | ||||
|                     {{ form_widget(form.dateFrom) }} | ||||
|                 </div> | ||||
|                 <div class="col-md-4"> | ||||
|                     {{ form_label(form.dateTo) }} | ||||
|                     {{ form_widget(form.dateTo) }} | ||||
|                 </div> | ||||
|             </div> | ||||
|             <div class="row"> | ||||
|                 <div class="col-md-4"> | ||||
|                     {{ form_label(form.onlyMe) }} | ||||
|                     {{ form_widget(form.onlyMe) }} | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|  | ||||
|         <ul class="record_actions"> | ||||
|             <li> | ||||
|                 <button type="submit" class="btn btn-save change-icon"> | ||||
|                     <i class="fa fa-filter"></i> Filtrer | ||||
|                 </button> | ||||
|             </li> | ||||
|         </ul> | ||||
|  | ||||
|         {{ form_end(form) }} | ||||
| {#    </div>#} | ||||
|  | ||||
|     {% include 'ChillActivityBundle:Activity:list.html.twig' with {'context': 'accompanyingCourse'} %} | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,8 @@ | ||||
| --- | ||||
| services: | ||||
|     Chill\ActivityBundle\Form\ActivityFilterType: | ||||
|         autowire: true | ||||
|         autoconfigure: true | ||||
|     Chill\ActivityBundle\Form\Type\TranslatableActivityReasonCategoryType: | ||||
|         autowire: true | ||||
|         autoconfigure: true | ||||
|   | ||||
| @@ -284,6 +284,8 @@ Filter acp which has no activity: Filtrer les parcours qui n’ont pas d’activ | ||||
| Filtered acp which has no activities: Filtrer les parcours sans activité associée | ||||
| Group acp by activity number: Grouper les parcours par nombre d’activité | ||||
|  | ||||
| My activities only: Mes échanges uniquement | ||||
|  | ||||
| #aggregators | ||||
| Activity type: Type d'activité | ||||
| Activity user: Utilisateur lié à l'activité | ||||
|   | ||||
		Reference in New Issue
	
	Block a user