mirror of
https://github.com/grocy/grocy.git
synced 2025-08-20 04:12:59 +00:00
Apply timezone for iCalendar events (closes #1637)
This commit is contained in:
@@ -4,6 +4,7 @@ namespace Grocy\Controllers;
|
|||||||
|
|
||||||
use Eluceo\iCal\Domain\Entity\Calendar;
|
use Eluceo\iCal\Domain\Entity\Calendar;
|
||||||
use Eluceo\iCal\Domain\Entity\Event;
|
use Eluceo\iCal\Domain\Entity\Event;
|
||||||
|
use Eluceo\iCal\Domain\Entity\TimeZone;
|
||||||
use Eluceo\iCal\Domain\ValueObject\Date;
|
use Eluceo\iCal\Domain\ValueObject\Date;
|
||||||
use Eluceo\iCal\Domain\ValueObject\DateTime;
|
use Eluceo\iCal\Domain\ValueObject\DateTime;
|
||||||
use Eluceo\iCal\Domain\ValueObject\SingleDay;
|
use Eluceo\iCal\Domain\ValueObject\SingleDay;
|
||||||
@@ -17,8 +18,12 @@ class CalendarApiController extends BaseApiController
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
$events = $this->getCalendarService()->GetEvents();
|
$events = $this->getCalendarService()->GetEvents();
|
||||||
|
$minDate = null;
|
||||||
|
$maxDate = null;
|
||||||
|
|
||||||
$vCalendar = new Calendar();
|
$vCalendar = new Calendar();
|
||||||
|
$vCalendar->setProductIdentifier('grocy');
|
||||||
|
|
||||||
foreach ($events as $event)
|
foreach ($events as $event)
|
||||||
{
|
{
|
||||||
if (!isset($event['start']))
|
if (!isset($event['start']))
|
||||||
@@ -37,13 +42,17 @@ class CalendarApiController extends BaseApiController
|
|||||||
// All-day event
|
// All-day event
|
||||||
$date = new Date(\DateTimeImmutable::createFromFormat('Y-m-d', substr($event['start'], 0, 10)));
|
$date = new Date(\DateTimeImmutable::createFromFormat('Y-m-d', substr($event['start'], 0, 10)));
|
||||||
$vEventOccurrence = new SingleDay($date);
|
$vEventOccurrence = new SingleDay($date);
|
||||||
|
|
||||||
|
$compareDate = \DateTimeImmutable::createFromFormat('Y-m-d', substr($event['start'], 0, 10));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Time-point event
|
// Time-point event
|
||||||
$start = new DateTime(\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $event['start']), false);
|
$start = new DateTime(\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $event['start']), true);
|
||||||
$end = new DateTime(\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $event['start']), false);
|
$end = new DateTime(\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $event['start']), true);
|
||||||
$vEventOccurrence = new TimeSpan($start, $end);
|
$vEventOccurrence = new TimeSpan($start, $end);
|
||||||
|
|
||||||
|
$compareDate = \DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $event['start']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$vEvent = new Event();
|
$vEvent = new Event();
|
||||||
@@ -52,6 +61,20 @@ class CalendarApiController extends BaseApiController
|
|||||||
->setDescription($description);
|
->setDescription($description);
|
||||||
|
|
||||||
$vCalendar->addEvent($vEvent);
|
$vCalendar->addEvent($vEvent);
|
||||||
|
|
||||||
|
if ($minDate == null || $compareDate < $minDate)
|
||||||
|
{
|
||||||
|
$minDate = $compareDate;
|
||||||
|
}
|
||||||
|
if ($maxDate == null || $compareDate > $maxDate)
|
||||||
|
{
|
||||||
|
$maxDate = $compareDate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($minDate != null && $maxDate != null)
|
||||||
|
{
|
||||||
|
$vCalendar->addTimeZone(TimeZone::createFromPhpDateTimeZone(new \DateTimeZone(date_default_timezone_get()), $minDate, $maxDate));
|
||||||
}
|
}
|
||||||
|
|
||||||
$response->write((new CalendarFactory())->createCalendar($vCalendar));
|
$response->write((new CalendarFactory())->createCalendar($vCalendar));
|
||||||
|
Reference in New Issue
Block a user