From 98e2258f5fbf93b75043ee901a802b7d97614558 Mon Sep 17 00:00:00 2001 From: Sukhwinder Dhillon Date: Wed, 18 Jun 2025 16:53:53 +0200 Subject: [PATCH 1/2] RotationConfigForm: Add `end of day` time option to multi day mode - The hidden elements are intorduces, so the form's "To day" field does not change automatically, to avoid confusion, when a timestamp with "endOfDay" flag is selected. --- application/forms/RotationConfigForm.php | 37 ++++++++++++++++++++---- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/application/forms/RotationConfigForm.php b/application/forms/RotationConfigForm.php index db38f31c..c10fd8a1 100644 --- a/application/forms/RotationConfigForm.php +++ b/application/forms/RotationConfigForm.php @@ -895,14 +895,18 @@ protected function assembleMultiDayOptions(FieldsetElement $options): DateTime $toDays[$i] = sprintf('%s (%s)', $day, $this->translate('Next week')); } - $options->addElement('select', 'to_day', [ + $options->addElement('hidden', 'to_day'); + $options->addElement('hidden', 'to_at'); + + $options->addElement('select', 'to_day_ignored', [ 'class' => 'autosubmit', 'required' => true, + 'ignore' => true, 'options' => $toDays, - 'value' => 7, + 'value' => $options->getValue('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 +924,40 @@ protected function assembleMultiDayOptions(FieldsetElement $options): DateTime ]); $options->registerElement($fromAt); - if ($selectedFromDay === (int) $to->getValue()) { + $timeOptionsFirstKey = array_key_first($timeOptions); + $selectedToDay = (int) $to->getValue(); + $endOfDay = 'endOfDay'; + if ($selectedFromDay === $selectedToDay) { $selectedFromAt = $fromAt->getValue(); $keyIndex = array_search($selectedFromAt, array_keys($timeOptions)); $timeOptions = array_slice($timeOptions, 0, $keyIndex + 1, true); + } else { + $timeOptions[$endOfDay] = 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->getValue('to_at'), ]); $options->registerElement($toAt); + $selectedToAt = $toAt->getValue(); + + if ($selectedToAt === $endOfDay) { + $selectedToDay = $selectedToDay === 7 ? 1 : $selectedToDay + 1; + $selectedToAt = $timeOptionsFirstKey; + } + + $options->getElement('to_day')->setValue($selectedToDay); + $options->getElement('to_at')->setValue($selectedToAt); + $from->prependWrapper( (new HtmlDocument())->addHtml( $from, From f277e6bd0b2e7a93de5ea5e34698b8947da93563 Mon Sep 17 00:00:00 2001 From: Sukhwinder Dhillon Date: Mon, 15 Sep 2025 14:12:23 +0200 Subject: [PATCH 2/2] RotationConfigForm: Add end of day time option to multi day mode --- application/forms/RotationConfigForm.php | 45 +++++++++++++----------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/application/forms/RotationConfigForm.php b/application/forms/RotationConfigForm.php index c10fd8a1..843732a8 100644 --- a/application/forms/RotationConfigForm.php +++ b/application/forms/RotationConfigForm.php @@ -895,18 +895,14 @@ protected function assembleMultiDayOptions(FieldsetElement $options): DateTime $toDays[$i] = sprintf('%s (%s)', $day, $this->translate('Next week')); } - $options->addElement('hidden', 'to_day'); - $options->addElement('hidden', 'to_at'); - - $options->addElement('select', 'to_day_ignored', [ + $options->addElement('select', 'to_day', [ 'class' => 'autosubmit', 'required' => true, - 'ignore' => true, 'options' => $toDays, - 'value' => $options->getValue('to_day', 7), + 'value' => 7, 'label' => $this->translate('To', 'notifications.rotation') ]); - $to = $options->getElement('to_day_ignored'); + $to = $options->getElement('to_day'); $options->addElement('number', 'interval', [ 'required' => true, @@ -923,14 +919,22 @@ protected function assembleMultiDayOptions(FieldsetElement $options): DateTime 'options' => $timeOptions ]); $options->registerElement($fromAt); + $selectedFromAt = $fromAt->getValue(); + + $removeOutOfRangeToAtOptions = function () use ($selectedFromAt, $timeOptions) { + return array_slice( + $timeOptions, + 0, + array_search($selectedFromAt, array_keys($timeOptions), true) + 1, + true + ); + }; $timeOptionsFirstKey = array_key_first($timeOptions); $selectedToDay = (int) $to->getValue(); $endOfDay = 'endOfDay'; if ($selectedFromDay === $selectedToDay) { - $selectedFromAt = $fromAt->getValue(); - $keyIndex = array_search($selectedFromAt, array_keys($timeOptions)); - $timeOptions = array_slice($timeOptions, 0, $keyIndex + 1, true); + $timeOptions = $removeOutOfRangeToAtOptions(); } else { $timeOptions[$endOfDay] = sprintf( '%s (%s)', @@ -939,24 +943,23 @@ protected function assembleMultiDayOptions(FieldsetElement $options): DateTime ); } - $toAt = $options->createElement('select', 'to_at_ignored', [ + $toAt = $options->createElement('select', 'to_at', [ 'class' => 'autosubmit', 'required' => true, - 'ignore' => true, - 'options' => $timeOptions, - 'value' => $options->getValue('to_at'), + 'options' => $timeOptions ]); $options->registerElement($toAt); - $selectedToAt = $toAt->getValue(); - - if ($selectedToAt === $endOfDay) { + if ($toAt->getValue() === $endOfDay) { $selectedToDay = $selectedToDay === 7 ? 1 : $selectedToDay + 1; - $selectedToAt = $timeOptionsFirstKey; - } - $options->getElement('to_day')->setValue($selectedToDay); - $options->getElement('to_at')->setValue($selectedToAt); + if ($selectedFromDay === $selectedToDay) { + $toAt->setOptions($removeOutOfRangeToAtOptions()); + } + + $to->setValue($selectedToDay); + $toAt->setValue($timeOptionsFirstKey); + } $from->prependWrapper( (new HtmlDocument())->addHtml(