diff --git a/src/Bundle/ChillAsideActivityBundle/src/Entity/AsideActivity.php b/src/Bundle/ChillAsideActivityBundle/src/Entity/AsideActivity.php index 816dd88a0..0da691ff2 100644 --- a/src/Bundle/ChillAsideActivityBundle/src/Entity/AsideActivity.php +++ b/src/Bundle/ChillAsideActivityBundle/src/Entity/AsideActivity.php @@ -32,39 +32,39 @@ final class AsideActivity implements TrackUpdateInterface, TrackCreationInterfac * @ORM\ManyToOne(targetEntity=User::class) * @ORM\JoinColumn(nullable=false) */ - private $createdBy; + private \Chill\MainBundle\Entity\User $createdBy; /** * @ORM\Column(type="datetime_immutable") */ - private $createdAt; + private \DateTimeInterface $createdAt; /** * @ORM\ManyToOne(targetEntity=User::class) */ - private $updatedBy; + private \Chill\MainBundle\Entity\User $updatedBy; /** * @ORM\Column(type="datetime_immutable", nullable=true) */ - private $updatedAt; + private \DateTimeInterface $updatedAt; /** * @ORM\ManyToOne(targetEntity=User::class) * @ORM\JoinColumn(nullable=false) * @Assert\NotBlank() */ - private $agent; + private \Chill\MainBundle\Entity\User $agent; /** * @ORM\Column(type="datetime_immutable") */ - private $date; + private \DateTimeInterface $date; /** - * @ORM\Column(type="integer", nullable=true) + * @ORM\Column(type="time", nullable=true) */ - private $duration; + private ?\DateTime $duration = null; /** * @ORM\Column(type="string", length=100, nullable=true) @@ -129,7 +129,7 @@ final class AsideActivity implements TrackUpdateInterface, TrackCreationInterfac return $this; } - public function getUpdatedAt(): ?\DateTimeImmutable + public function getUpdatedAt(): ?\DateTimeInterface { return $this->updatedAt; } @@ -165,12 +165,12 @@ final class AsideActivity implements TrackUpdateInterface, TrackCreationInterfac return $this; } - public function getDuration(): ?\DateTimeInterface + public function getDuration(): ?\DateTime { return $this->duration; } - public function setDuration(?\DateTimeInterface $duration): self + public function setDuration(?\DateTime $duration): self { $this->duration = $duration; diff --git a/src/Bundle/ChillAsideActivityBundle/src/Form/AsideActivityFormType.php b/src/Bundle/ChillAsideActivityBundle/src/Form/AsideActivityFormType.php index fadfffce9..b34e5bdf9 100644 --- a/src/Bundle/ChillAsideActivityBundle/src/Form/AsideActivityFormType.php +++ b/src/Bundle/ChillAsideActivityBundle/src/Form/AsideActivityFormType.php @@ -6,36 +6,41 @@ use Chill\AsideActivityBundle\Entity\AsideActivity; use Chill\AsideActivityBundle\Entity\AsideActivityCategory; use Chill\MainBundle\Entity\User; use Chill\MainBundle\Form\Type\ChillDateType; +use Chill\MainBundle\Form\Type\ChillTextareaType; use Chill\MainBundle\Templating\TranslatableStringHelper; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToTimestampTransformer; +use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Form\Extension\Core\Type\TextareaType; - +use Symfony\Component\Form\FormEvent; +use Symfony\Component\Form\FormEvents; final class AsideActivityFormType extends AbstractType { - // protected array $timeChoices; + protected array $timeChoices; private TranslatableStringHelper $translatableStringHelper; - public function __construct (TranslatableStringHelper $translatableStringHelper){ - // $this->timeChoices = $timeChoices; + public function __construct (TranslatableStringHelper $translatableStringHelper, array $timeChoices){ + $this->timeChoices = $timeChoices; $this->translatableStringHelper = $translatableStringHelper; } public function buildForm(FormBuilderInterface $builder, array $options) { - // $timeChoices = []; + $timeChoices = []; - // foreach ($this->timeChoices as $e) { - // $timeChoices[$e['label']] = $e['seconds']; - // } + foreach ($this->timeChoices as $e) { + $timeChoices[$e['label']] = $e['seconds']; + } - // $durationTimeOptions = [ - // 'choices' => $timeChoices, - // 'placeholder' => 'Choose the duration', - // ]; + $durationTimeTransformer = new DateTimeToTimestampTransformer('GMT', 'GMT'); + $durationTimeOptions = [ + 'choices' => $timeChoices, + 'placeholder' => 'Choose the duration', + ]; $builder ->add('agent', EntityType::class, @@ -50,7 +55,7 @@ final class AsideActivityFormType extends AbstractType ->add('date', ChillDateType::class, [ 'label' => 'date', - 'data' => new \DateTime(), + 'data' => new \DateTimeImmutable(), //SETTING RANGE ONLY POSSIBLE WITH WIDGET 'CHOICE' AND NOT 'SINGLE_TEXT'? // 'widget' => 'choice', // 'years' => range(2020, date('Y')), @@ -69,11 +74,52 @@ final class AsideActivityFormType extends AbstractType return $this->translatableStringHelper->localize($asideActivityCategory->getTitle()); }, ]) - // ->add('durationTime', ChoiceType::class, $durationTimeOptions) - ->add('note', TextareaType::class, [ + ->add('duration', ChoiceType::class, $durationTimeOptions) + ->add('note', ChillTextareaType::class, [ 'label' => 'Note', 'required' => false, ]); + + foreach (['duration'] as $fieldName) + { + $builder->get($fieldName) + ->addModelTransformer($durationTimeTransformer); + + $builder->get($fieldName) + ->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $formEvent) use ( + $timeChoices, + $builder, + $durationTimeTransformer, + $durationTimeOptions, + $fieldName + ) { + // set the timezone to GMT, and fix the difference between current and GMT + // the datetimetransformer will then handle timezone as GMT + $timezoneUTC = new \DateTimeZone('GMT'); + /* @var $data \DateTime */ + $data = $formEvent->getData() === NULL ? + \DateTime::createFromFormat('U', 300) : + $formEvent->getData(); + $seconds = $data->getTimezone()->getOffset($data); + $data->setTimeZone($timezoneUTC); + $data->add(new \DateInterval('PT'.$seconds.'S')); + + // test if the timestamp is in the choices. + // If not, recreate the field with the new timestamp + if (!in_array($data->getTimestamp(), $timeChoices)) { + // the data are not in the possible values. add them + $timeChoices[$data->format('H:i')] = $data->getTimestamp(); + $form = $builder->create($fieldName, ChoiceType::class, array_merge( + $durationTimeOptions, [ + 'choices' => $timeChoices, + 'auto_initialize' => false + ] + )); + $form->addModelTransformer($durationTimeTransformer); + $formEvent->getForm()->getParent()->add($form->getForm()); + } + }); + } } public function configureOptions(OptionsResolver $resolver): void diff --git a/src/Bundle/ChillAsideActivityBundle/src/Form/Type/TranslatableAsideActivityCategory.php b/src/Bundle/ChillAsideActivityBundle/src/Form/Type/TranslatableAsideActivityCategory.php deleted file mode 100644 index 7340afd80..000000000 --- a/src/Bundle/ChillAsideActivityBundle/src/Form/Type/TranslatableAsideActivityCategory.php +++ /dev/null @@ -1,54 +0,0 @@ -requestStack = $requestStack; - } - - public function getBlockPrefix() - { - return 'translatable_aside_activity_category'; - } - - public function getParent() - { - return EntityType::class; - } - - public function configureOptions(OptionsResolver $resolver) - { - $locale = $this->requestStack->getCurrentRequest()->getLocale(); - $resolver->setDefaults( - array( - 'class' => 'ChillAsideActivityBundle:AsideActivityCategory', - 'choice_label' => 'name['.$locale.']', - 'query_builder' => function (EntityRepository $er) { - return $er->createQueryBuilder('c') - ->where('c.active = true'); - } - ) - ); - } -} \ No newline at end of file diff --git a/src/Bundle/ChillAsideActivityBundle/src/config/services/form.yaml b/src/Bundle/ChillAsideActivityBundle/src/config/services/form.yaml index 52228fdcb..193c61ed0 100644 --- a/src/Bundle/ChillAsideActivityBundle/src/config/services/form.yaml +++ b/src/Bundle/ChillAsideActivityBundle/src/config/services/form.yaml @@ -1,8 +1,9 @@ +--- services: chill.asideactivity.form.type.asideactivity: class: Chill\AsideActivityBundle\Form\AsideActivityFormType arguments: - "@chill.main.helper.translatable_string" - # - "%chill_activity.form.time_duration%" + - "%chill_activity.form.time_duration%" tags: - { name: form.type, alias: chill_asideactivitybundle_asideactivity } \ No newline at end of file diff --git a/src/Bundle/ChillAsideActivityBundle/src/translations/messages.yaml b/src/Bundle/ChillAsideActivityBundle/src/translations/messages.yaml deleted file mode 100644 index e69de29bb..000000000