Skip to content

Commit d533ec7

Browse files
committed
Replace ScheduleDateTimeFactory ...
... by `ScheduleTimezoneStorage`. This just stores the display and schedule timezone, instead of creating `DateTime` objects.
1 parent f0e8413 commit d533ec7

File tree

9 files changed

+137
-112
lines changed

9 files changed

+137
-112
lines changed

application/controllers/ScheduleController.php

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
use Icinga\Module\Notifications\Forms\ScheduleForm;
1212
use Icinga\Module\Notifications\Model\Schedule;
1313
use Icinga\Module\Notifications\Widget\RecipientSuggestions;
14-
use Icinga\Module\Notifications\Util\ScheduleDateTimeFactory;
14+
use Icinga\Module\Notifications\Util\ScheduleTimezoneStorage;
1515
use Icinga\Module\Notifications\Web\Control\TimezonePicker;
1616
use Icinga\Module\Notifications\Widget\Detail\ScheduleDetail;
1717
use Icinga\Module\Notifications\Widget\TimezoneWarning;
@@ -37,6 +37,8 @@ public function indexAction(): void
3737
$this->httpNotFound(t('Schedule not found'));
3838
}
3939

40+
ScheduleTimezoneStorage::setScheduleTimezone($schedule->timezone);
41+
4042
$this->addTitleTab(sprintf(t('Schedule: %s'), $schedule->name));
4143

4244
$this->controls->addHtml(
@@ -54,15 +56,7 @@ public function indexAction(): void
5456
->setAction(Url::fromRequest()->getAbsoluteUrl())
5557
->populate(['mode' => $this->params->get('mode')])
5658
->on(Form::ON_SUCCESS, function (ScheduleDetail\Controls $controls) use ($id) {
57-
$redirectUrl = Links::schedule($id)->with(['mode' => $controls->getMode()]);
58-
$requestUrl = Url::fromRequest();
59-
$defaultTimezoneParam = TimezonePicker::DEFAULT_TIMEZONE_PARAM;
60-
if ($requestUrl->hasParam($defaultTimezoneParam)) {
61-
$redirectUrl->addParams(
62-
[$defaultTimezoneParam => $requestUrl->getParam($defaultTimezoneParam)]
63-
);
64-
}
65-
$this->redirectNow($redirectUrl);
59+
$this->redirectNow(Links::schedule($id)->with(['mode' => $controls->getMode()]));
6660
})
6761
->handleRequest($this->getServerRequest());
6862

@@ -122,10 +116,9 @@ public function addAction(): void
122116
public function addRotationAction(): void
123117
{
124118
$scheduleId = (int) $this->params->getRequired('schedule');
125-
$displayTimezone = $this->params->get('display_timezone');
126-
$this->setTitle($this->translate('Add Rotation'));
127-
128119
$scheduleTimezone = $this->getScheduleTimezone($scheduleId);
120+
$displayTimezone = $this->params->get('display_timezone') ?? $scheduleTimezone;
121+
$this->setTitle($this->translate('Add Rotation'));
129122

130123
if ($displayTimezone !== $scheduleTimezone) {
131124
$this->addContent(new TimezoneWarning($scheduleTimezone));
@@ -161,11 +154,10 @@ public function addRotationAction(): void
161154
public function editRotationAction(): void
162155
{
163156
$id = (int) $this->params->getRequired('id');
164-
$displayTimezone = $this->params->get('display_timezone');
165157
$scheduleId = (int) $this->params->getRequired('schedule');
166-
$this->setTitle($this->translate('Edit Rotation'));
167-
168158
$scheduleTimezone = $this->getScheduleTimezone($scheduleId);
159+
$displayTimezone = $this->params->get('display_timezone') ?? $scheduleTimezone;
160+
$this->setTitle($this->translate('Edit Rotation'));
169161

170162
if ($displayTimezone !== $scheduleTimezone) {
171163
$this->addContent(new TimezoneWarning($scheduleTimezone));
@@ -266,7 +258,7 @@ protected function createTimezonePicker(string $defaultTimezone): TimezonePicker
266258
$defaultTimezoneParam = TimezonePicker::DEFAULT_TIMEZONE_PARAM;
267259
$timezoneParam = $this->params->shift($defaultTimezoneParam);
268260

269-
ScheduleDateTimeFactory::setDisplayTimezone($timezoneParam ?? $defaultTimezone);
261+
ScheduleTimezoneStorage::setDisplayTimezone($timezoneParam ?? $defaultTimezone);
270262

271263
return (new TimezonePicker())
272264
->populate([$defaultTimezoneParam => $timezoneParam ?? $defaultTimezone])

library/Notifications/Common/Links.php

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
namespace Icinga\Module\Notifications\Common;
66

7-
use Icinga\Module\Notifications\Util\ScheduleDateTimeFactory;
7+
use Icinga\Module\Notifications\Util\ScheduleTimezoneStorage;
8+
use Icinga\Module\Notifications\Web\Control\TimezonePicker;
89
use ipl\Web\Url;
910

1011
/**
@@ -84,7 +85,15 @@ public static function schedules(): Url
8485

8586
public static function schedule(int $id): Url
8687
{
87-
return Url::fromPath('notifications/schedule', ['id' => $id]);
88+
$redirectUrl = Url::fromPath('notifications/schedule', ['id' => $id]);
89+
90+
if (ScheduleTimezoneStorage::differ()) {
91+
$redirectUrl->addParams([
92+
TimezonePicker::DEFAULT_TIMEZONE_PARAM => ScheduleTimezoneStorage::getDisplayTimezone()->getName()
93+
]);
94+
}
95+
96+
return $redirectUrl;
8897
}
8998

9099
public static function scheduleAdd(): Url
@@ -124,23 +133,40 @@ public static function contactGroupEdit(int $id): Url
124133

125134
public static function rotationAdd(int $scheduleId): Url
126135
{
127-
return Url::fromPath('notifications/schedule/add-rotation', [
128-
'schedule' => $scheduleId,
129-
'display_timezone' => ScheduleDateTimeFactory::getDisplayTimezone()->getName()
130-
]);
136+
$redirectUrl = Url::fromPath('notifications/schedule/add-rotation', ['schedule' => $scheduleId]);
137+
138+
if (ScheduleTimezoneStorage::differ()) {
139+
$redirectUrl->addParams([
140+
TimezonePicker::DEFAULT_TIMEZONE_PARAM => ScheduleTimezoneStorage::getDisplayTimezone()->getName()
141+
]);
142+
}
143+
144+
return $redirectUrl;
131145
}
132146

133147
public static function rotationSettings(int $id, int $scheduleId): Url
134148
{
135-
return Url::fromPath('notifications/schedule/edit-rotation', [
136-
'id' => $id,
137-
'schedule' => $scheduleId,
138-
'display_timezone' => ScheduleDateTimeFactory::getDisplayTimezone()->getName()
139-
]);
149+
$redirectUrl = Url::fromPath('notifications/schedule/edit-rotation', ['id' => $id, 'schedule' => $scheduleId]);
150+
151+
if (ScheduleTimezoneStorage::differ()) {
152+
$redirectUrl->addParams([
153+
TimezonePicker::DEFAULT_TIMEZONE_PARAM => ScheduleTimezoneStorage::getDisplayTimezone()->getName()
154+
]);
155+
}
156+
157+
return $redirectUrl;
140158
}
141159

142160
public static function moveRotation(): Url
143161
{
144-
return Url::fromPath('notifications/schedule/move-rotation');
162+
$redirectUrl = Url::fromPath('notifications/schedule/move-rotation');
163+
164+
if (ScheduleTimezoneStorage::differ()) {
165+
$redirectUrl->addParams([
166+
TimezonePicker::DEFAULT_TIMEZONE_PARAM => ScheduleTimezoneStorage::getDisplayTimezone()->getName()
167+
]);
168+
}
169+
170+
return $redirectUrl;
145171
}
146172
}

library/Notifications/Util/ScheduleDateTimeFactory.php

Lines changed: 0 additions & 66 deletions
This file was deleted.
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
<?php
2+
3+
/* Icinga Notifications Web | (c) 2025 Icinga GmbH | GPLv2 */
4+
5+
namespace Icinga\Module\Notifications\Util;
6+
7+
use DateTimeZone;
8+
9+
/**
10+
* Storage to store display and schedule timezones
11+
*/
12+
class ScheduleTimezoneStorage
13+
{
14+
protected static ?DateTimeZone $displayTimezone;
15+
16+
protected static ?DateTimeZone $scheduleTimezone;
17+
18+
/**
19+
* Set the display timezone
20+
*
21+
* @param DateTimeZone|string $timezone The timezone identifier (e.g. 'Europe/Berlin')
22+
*
23+
* @return void
24+
*/
25+
public static function setDisplayTimezone(DateTimeZone|string $timezone): void
26+
{
27+
if ($timezone instanceof DateTimeZone) {
28+
static::$displayTimezone = $timezone;
29+
} else {
30+
static::$displayTimezone = new DateTimeZone($timezone);
31+
}
32+
}
33+
34+
/**
35+
* Get the display timezone
36+
*
37+
* @return DateTimeZone
38+
*/
39+
public static function getDisplayTimezone(): DateTimeZone
40+
{
41+
return static::$displayTimezone ?? static::getScheduleTimezone();
42+
}
43+
44+
/**
45+
* Set the schedule timezone
46+
*
47+
* @param DateTimeZone|string $timezone The timezone identifier (e.g. 'Europe/Berlin')
48+
*
49+
* @return void
50+
*/
51+
public static function setScheduleTimezone(DateTimeZone|string $timezone): void
52+
{
53+
if ($timezone instanceof DateTimeZone) {
54+
static::$scheduleTimezone = $timezone;
55+
} else {
56+
static::$scheduleTimezone = new DateTimeZone($timezone);
57+
}
58+
}
59+
60+
/**
61+
* Get the schedule timezone
62+
*
63+
* @return DateTimeZone
64+
*/
65+
public static function getScheduleTimezone(): DateTimeZone
66+
{
67+
return static::$scheduleTimezone ?? new DateTimeZone(date_default_timezone_get());
68+
}
69+
70+
/**
71+
* Get whether the display and schedule timezones differ
72+
*
73+
* @return bool Whether the display and schedule timezones differ
74+
*/
75+
public static function differ(): bool
76+
{
77+
return static::getDisplayTimezone() != static::getScheduleTimezone();
78+
}
79+
}

library/Notifications/Widget/Detail/ScheduleDetail/Controls.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
namespace Icinga\Module\Notifications\Widget\Detail\ScheduleDetail;
66

77
use DateTime;
8-
use Icinga\Module\Notifications\Util\ScheduleDateTimeFactory;
8+
use Icinga\Module\Notifications\Util\ScheduleTimezoneStorage;
99
use Icinga\Web\Session;
1010
use ipl\Html\Attributes;
1111
use ipl\Html\Form;
@@ -65,7 +65,7 @@ public function getNumberOfDays(): int
6565
*/
6666
public function getStartDate(): DateTime
6767
{
68-
return ScheduleDateTimeFactory::createDateTime()->setTime(0, 0);
68+
return (new DateTime('today', ScheduleTimezoneStorage::getDisplayTimezone()));
6969
}
7070

7171
protected function onSuccess()

library/Notifications/Widget/TimeGrid/DaysHeader.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
use DateInterval;
88
use DateTime;
9-
use Icinga\Module\Notifications\Util\ScheduleDateTimeFactory;
109
use IntlDateFormatter;
1110
use ipl\Html\Attributes;
1211
use ipl\Html\BaseHtmlElement;
@@ -53,14 +52,15 @@ public function assemble(): void
5352
$this->translate('Sun', 'sunday')
5453
];
5554

55+
$displayTimezone = $this->startDay->getTimezone();
5656
$interval = new DateInterval('P1D');
57-
$today = ScheduleDateTimeFactory::createDateTime()->setTime(0, 0);
57+
$today = new DateTime('today', $displayTimezone);
5858
$time = clone $this->startDay;
5959
$dateFormatter = new IntlDateFormatter(
6060
Locale::getDefault(),
6161
IntlDateFormatter::MEDIUM,
6262
IntlDateFormatter::NONE,
63-
ScheduleDateTimeFactory::getDisplayTimezone()
63+
$displayTimezone
6464
);
6565

6666
for ($i = 0; $i < $this->days; $i++) {

library/Notifications/Widget/Timeline.php

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
use DateTime;
99
use Icinga\Module\Notifications\Common\Links;
1010
use Icinga\Module\Notifications\Forms\MoveRotationForm;
11-
use Icinga\Module\Notifications\Util\ScheduleDateTimeFactory;
1211
use Icinga\Module\Notifications\Widget\TimeGrid\DynamicGrid;
1312
use Icinga\Module\Notifications\Widget\TimeGrid\EntryProvider;
1413
use Icinga\Module\Notifications\Widget\TimeGrid\GridStep;
@@ -307,11 +306,7 @@ protected function assembleSidebarEntry(Rotation $rotation): BaseHtmlElement
307306
$entry = new HtmlElement('div', Attributes::create(['class' => 'rotation-name']));
308307

309308
$form = new MoveRotationForm();
310-
$form->setAction(
311-
Links::moveRotation()
312-
->with(['display_timezone' => ScheduleDateTimeFactory::getDisplayTimezone()->getName()])
313-
->getAbsoluteUrl()
314-
);
309+
$form->setAction(Links::moveRotation()->getAbsoluteUrl());
315310
$form->populate([
316311
'rotation' => $rotation->getId(),
317312
'priority' => $rotation->getPriority()
@@ -358,14 +353,16 @@ protected function assemble()
358353
)
359354
);
360355

356+
$displayTimezone = $this->start->getTimezone();
357+
361358
$dateFormatter = new IntlDateFormatter(
362359
Locale::getDefault(),
363360
IntlDateFormatter::NONE,
364361
IntlDateFormatter::SHORT,
365-
ScheduleDateTimeFactory::getDisplayTimezone()
362+
$displayTimezone
366363
);
367364

368-
$now = ScheduleDateTimeFactory::createDateTime();
365+
$now = new DateTime('now', $displayTimezone);
369366
$currentTime = new HtmlElement(
370367
'div',
371368
new Attributes(['class' => 'time-hand']),

library/Notifications/Widget/Timeline/Entry.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
namespace Icinga\Module\Notifications\Widget\Timeline;
66

7-
use Icinga\Module\Notifications\Util\ScheduleDateTimeFactory;
87
use Icinga\Module\Notifications\Widget\TimeGrid;
98
use ipl\Html\Attributes;
109
use ipl\Html\BaseHtmlElement;
@@ -62,7 +61,7 @@ protected function assembleContainer(BaseHtmlElement $container): void
6261
\Locale::getDefault(),
6362
$dateType,
6463
$timeType,
65-
ScheduleDateTimeFactory::getDisplayTimezone()
64+
$this->getStart()->getTimezone()
6665
);
6766

6867
$container->addAttributes([

0 commit comments

Comments
 (0)