From 7ed1998d0423afc05ee62557254bd89ae6b312d9 Mon Sep 17 00:00:00 2001 From: Kevin Papst Date: Fri, 29 Oct 2021 21:35:48 +0200 Subject: [PATCH] fixes for new quick-entry week form (#2887) --- src/Form/QuickEntryForm.php | 24 +++++++++++++++++++ src/Form/Type/QuickEntryWeekType.php | 16 ++++++++++++- tests/Controller/TimesheetControllerTest.php | 4 +++- .../TimesheetTeamControllerTest.php | 4 +++- 4 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/Form/QuickEntryForm.php b/src/Form/QuickEntryForm.php index 28c15ecf..ff3cd30a 100644 --- a/src/Form/QuickEntryForm.php +++ b/src/Form/QuickEntryForm.php @@ -15,6 +15,7 @@ use App\Form\Type\WeekPickerType; use App\Model\QuickEntryWeek; use App\Validator\Constraints\QuickEntryModel; use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\CallbackTransformer; use Symfony\Component\Form\Extension\Core\Type\CollectionType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormInterface; @@ -36,6 +37,29 @@ class QuickEntryForm extends AbstractType */ public function buildForm(FormBuilderInterface $builder, array $options) { + $builder->addModelTransformer(new CallbackTransformer( + function ($value) { + // page is loaded, nothing to do + return $value; + }, + function (?QuickEntryWeek $value) { + if ($value === null) { + return null; + } + + foreach ($value->getRows() as $row) { + $project = $row->getProject(); + $activity = $row->getActivity(); + foreach ($row->getTimesheets() as $timesheet) { + $timesheet->setProject($project); + $timesheet->setActivity($activity); + } + } + + return $value; + } + )); + $startDate = new \DateTime(); if ($builder->getData() !== null) { /** @var QuickEntryWeek $data */ diff --git a/src/Form/Type/QuickEntryWeekType.php b/src/Form/Type/QuickEntryWeekType.php index a72e2a5e..b9b8ed05 100644 --- a/src/Form/Type/QuickEntryWeekType.php +++ b/src/Form/Type/QuickEntryWeekType.php @@ -82,9 +82,23 @@ class QuickEntryWeekType extends AbstractType $event->getForm()->add('activity', ActivityType::class, $activityOptions); }; - $builder->addEventListener(FormEvents::PRE_SET_DATA, $activityFunction); + $activityPreSubmitFunction = function (FormEvent $event) use ($activityOptions) { + $data = $event->getData(); + + if (isset($data['project']) && !empty($data['project'])) { + $activityOptions['projects'] = [$data['project']]; + } + + if (isset($data['activity']) && !empty($data['activity'])) { + $activityOptions['activities'] = [$data['activity']]; + } + + $event->getForm()->add('activity', ActivityType::class, $activityOptions); + }; + $builder->addEventListener(FormEvents::PRE_SUBMIT, $activityPreSubmitFunction); + $builder->add('timesheets', CollectionType::class, [ 'entry_type' => QuickEntryTimesheetType::class, 'label' => false, diff --git a/tests/Controller/TimesheetControllerTest.php b/tests/Controller/TimesheetControllerTest.php index 4798c126..f8f13836 100644 --- a/tests/Controller/TimesheetControllerTest.php +++ b/tests/Controller/TimesheetControllerTest.php @@ -695,6 +695,9 @@ class TimesheetControllerTest extends ControllerBaseTest $fixture->setStartDate($dateTime->createDateTime()); $fixture->setCallback(function (Timesheet $timesheet) { $timesheet->setDescription('Testing is fun!'); + $begin = clone $timesheet->getBegin(); + $begin->setTime(0, 0, 0); + $timesheet->setBegin($begin); $end = clone $timesheet->getBegin(); $end->modify('+ 8 hours'); $timesheet->setEnd($end); @@ -726,7 +729,6 @@ class TimesheetControllerTest extends ControllerBaseTest $this->assertEquals(2016, $timesheet->getRate()); $this->assertEquals(127, $timesheet->getHourlyRate()); $this->assertEquals(2016, $timesheet->getFixedRate()); - $this->assertTrue($timesheet->getDuration() == 28800 || $timesheet->getDuration() == 28860); // 1 minute rounding might be applied $this->assertEquals(2016, $timesheet->getRate()); } } diff --git a/tests/Controller/TimesheetTeamControllerTest.php b/tests/Controller/TimesheetTeamControllerTest.php index 3f5ce4e8..44232638 100644 --- a/tests/Controller/TimesheetTeamControllerTest.php +++ b/tests/Controller/TimesheetTeamControllerTest.php @@ -414,6 +414,9 @@ class TimesheetTeamControllerTest extends ControllerBaseTest $fixture->setStartDate($dateTime->createDateTime()); $fixture->setCallback(function (Timesheet $timesheet) { $timesheet->setDescription('Testing is fun!'); + $begin = clone $timesheet->getBegin(); + $begin->setTime(0, 0, 0); + $timesheet->setBegin($begin); $end = clone $timesheet->getBegin(); $end->modify('+ 8 hours'); $timesheet->setEnd($end); @@ -445,7 +448,6 @@ class TimesheetTeamControllerTest extends ControllerBaseTest $this->assertEquals(2016, $timesheet->getRate()); $this->assertEquals(127, $timesheet->getHourlyRate()); $this->assertEquals(2016, $timesheet->getFixedRate()); - $this->assertTrue($timesheet->getDuration() == 28800 || $timesheet->getDuration() == 28860); // 1 minute rounding might be applied $this->assertEquals(2016, $timesheet->getRate()); } }