From d3d1eabc08c8071dec097aff6989cf7f2752a280 Mon Sep 17 00:00:00 2001 From: Sukhwinder Dhillon Date: Wed, 18 Jun 2025 16:53:53 +0200 Subject: [PATCH] RotationConfigForm: Add `end of day` time option to multi day mode --- application/forms/RotationConfigForm.php | 38 ++++++++++++++++++++---- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/application/forms/RotationConfigForm.php b/application/forms/RotationConfigForm.php index db38f31c..b8fefc01 100644 --- a/application/forms/RotationConfigForm.php +++ b/application/forms/RotationConfigForm.php @@ -48,6 +48,8 @@ class RotationConfigForm extends CompatForm */ public const EXPERIMENTAL_OVERRIDES = false; + protected const DAY_END = 'dayEnd'; + /** @var ?int The ID of the affected schedule */ protected $scheduleId; @@ -895,14 +897,15 @@ protected function assembleMultiDayOptions(FieldsetElement $options): DateTime $toDays[$i] = sprintf('%s (%s)', $day, $this->translate('Next week')); } - $options->addElement('select', 'to_day', [ + $options->addElement('select', 'to_day_ignored', [ 'class' => 'autosubmit', 'required' => true, + 'ignore' => true, 'options' => $toDays, - 'value' => 7, + 'value' => $options->getPopulatedValue('to_day', 7), 'label' => $this->translate('To', 'notifications.rotation') ]); - $to = $options->getElement('to_day'); + $to = $options->getElement('to_day_ignored'); $options->addElement('number', 'interval', [ 'required' => true, @@ -920,19 +923,42 @@ protected function assembleMultiDayOptions(FieldsetElement $options): DateTime ]); $options->registerElement($fromAt); - if ($selectedFromDay === (int) $to->getValue()) { + $timeOptionsFirstKey = array_key_first($timeOptions); + $selectedToDay = (int) $to->getValue(); + if ($selectedFromDay === $selectedToDay) { $selectedFromAt = $fromAt->getValue(); $keyIndex = array_search($selectedFromAt, array_keys($timeOptions)); $timeOptions = array_slice($timeOptions, 0, $keyIndex + 1, true); + } else { + $timeOptions[self::DAY_END] = sprintf( + '%s (%s)', + $timeOptions[$timeOptionsFirstKey], + $this->translate('End of day') + ); } - $toAt = $options->createElement('select', 'to_at', [ + $toAt = $options->createElement('select', 'to_at_ignored', [ 'class' => 'autosubmit', 'required' => true, - 'options' => $timeOptions + 'ignore' => true, + 'options' => $timeOptions, + 'value' => $options->getPopulatedValue('to_at'), ]); $options->registerElement($toAt); + $selectedToAt = $toAt->getValue(); + + if ($selectedToAt === self::DAY_END) { + ++$selectedToDay; + $selectedToAt = $timeOptionsFirstKey; + } + + $options->clearPopulatedValue('to_day'); + $options->clearPopulatedValue('to_at'); + + $options->addElement('hidden', 'to_day', ['value' => $selectedToDay]); + $options->addElement('hidden', 'to_at', ['value' => $selectedToAt]); + $from->prependWrapper( (new HtmlDocument())->addHtml( $from,