feat: filter timeline by date range and hotels

This commit is contained in:
Björn Fromme
2025-03-21 11:52:29 +01:00
parent 9ffada111c
commit 06c32fd597
14 changed files with 316 additions and 28 deletions
+2 -2
View File
@@ -49,8 +49,8 @@ class TimelineService
foreach ($row as $entry) {
/** @var TimelineItem $entry */
if (
$item->getDateFrom() >= $entry->getDateFrom() && $item->getDateFrom() < $entry->getDateTo()
|| $item->getDateTo() >= $entry->getDateFrom() && $item->getDateTo() < $entry->getDateTo()
$item->getDateFrom() >= $entry->getDateFrom() && $item->getDateFrom() <= $entry->getDateTo()
|| $item->getDateTo() >= $entry->getDateFrom() && $item->getDateTo() <= $entry->getDateTo()
) {
$addToRow = false;
}
@@ -0,0 +1,60 @@
<?php
namespace App\Service\Common;
use App\Model\AbstractFilterDto;
use App\Model\TimelineFilterDto;
use Carbon\CarbonPeriod;
class TimelineFilterHandler extends AbstractFilterHandler
{
protected string $namespace = 'filter:timeline';
protected ?CarbonPeriod $period = null;
public function setPeriod(CarbonPeriod $period): void
{
$this->period = $period;
}
public function getFilterSettings(): TimelineFilterDto
{
if (null === $data = $this->getSession()->get($this->namespace)) {
$filterDto = new TimelineFilterDto();
$filterDto->setPeriod($this->period);
return $filterDto;
}
$filterDto = new TimelineFilterDto();
// override dates from form in case outside of selectable period
$periodFrom = $this->period->first()->toDateTimeImmutable();
$periodTo = $this->period->last()->toDateTimeImmutable();
if (isset($data['date_from'])) {
$dateFrom = max($periodFrom, $data['date_from']);
$periodFrom = $dateFrom;
}
if (isset($data['date_to'])) {
$dateTo = max($periodTo, $data['date_to']);
$periodTo = $dateTo;
}
if (isset($data['hotels']) && 0 < count($data['hotels'])) {
$filterDto->setHotels($data['hotels']);
}
$filterDto->setPeriod(new CarbonPeriod($periodFrom, $periodTo));
return $filterDto;
}
protected function saveFilterSettings(AbstractFilterDto $filterDto): void
{
/** @var TimelineFilterDto $filterDto */
$this->getSession()->set($this->namespace, [
'date_from' => $filterDto->getDateFrom(),
'date_to' => $filterDto->getDateTo(),
'hotels' => $filterDto->getHotels(),
]);
}
}