From 8a87e58bd2af09b59c38678eee6101f8a39d64ad Mon Sep 17 00:00:00 2001 From: Andrea Alberti Date: Tue, 18 Apr 2023 17:52:52 +0200 Subject: [PATCH 1/5] clone event in grouped finder --- .../Component/CalendarComponent.php | 72 ++++++++----------- 1 file changed, 28 insertions(+), 44 deletions(-) diff --git a/src/Controller/Component/CalendarComponent.php b/src/Controller/Component/CalendarComponent.php index ce3e6dc..38fc035 100644 --- a/src/Controller/Component/CalendarComponent.php +++ b/src/Controller/Component/CalendarComponent.php @@ -381,52 +381,36 @@ public function findGroupedByDay(Query $query, FrozenTime $from, FrozenTime|null ->find('closingDays') ->formatResults(function (iterable $results) use ($from, $to): iterable { $grouped = collection($results) - ->unfold(function (ObjectEntity $event) use ($from, $to): Generator { - foreach ($event->filtered_date_ranges as $dr) { - $start = (new FrozenTime($dr->start_date))->startOfDay(); - $end = (new FrozenTime($dr->end_date ?: $dr->start_date))->endOfDay(); - if ($start->gte($to) || $end->lt($from)) { - continue; - } - - $start = $start->max($from); - while ($start->lte($end) && $start->lte($to)) { - $day = $start->format('Y-m-d'); - $start = $start->addDay(); - - yield compact('event', 'day'); - } + ->unfold(function (ObjectEntity $object) use ($from, $to): Generator { + foreach ($object->filtered_date_ranges as $dr) { + $start = (new FrozenTime($dr->start_date))->startOfDay(); + $end = (new FrozenTime($dr->end_date ?: $dr->start_date))->endOfDay(); + if ($start->gte($to) || $end->lt($from)) { + continue; } - }) + + $start = $start->max($from); + while ($start->lte($end) && $start->lte($to)) { + $day = $start->format('Y-m-d'); + $start = $start->addDay(); + $event = clone $object; + $event->set('date_ranges', [$dr]); + $event->set('filtered_date_ranges', [$dr]); + + yield compact('event', 'day'); + } + } + }) ->groupBy('day') - ->map(function (array $items, string $day): array { - $today = new FrozenTime($day); - - return collection($items) - ->extract('event') - ->sortBy( - function (ObjectEntity $event) use ($today): string { - $closestDR = collection($event->filtered_date_ranges) - ->filter(function (DateRange $dr) use ($today): bool { - $start = (new FrozenTime($dr->start_date))->startOfDay(); - $end = (new FrozenTime($dr->end_date ?: $dr->start_date))->endOfDay(); - - return $today->gte($start) && $today->lt($end); - }) - ->sortBy( - fn (DateRange $dr): string => $dr->start_date->format('c'), - SORT_ASC, - SORT_NATURAL, - ) - ->first(); - - return ($closestDR->end_date ?? $closestDR->start_date)->format('c'); - }, - SORT_ASC, - SORT_NATURAL - ) - ->toList(); - }) + ->map(fn (array $items, string $day): array => collection($items) + ->extract('event') + ->sortBy( + fn (ObjectEntity $event): string => collection($event->filtered_date_ranges)->first()->start_date->format('c'), + SORT_ASC, + SORT_NATURAL + ) + ->toList() + ) ->toArray(); ksort($grouped, SORT_STRING); From ded92519215dcf70e05fb6308b3fec754a5198ce Mon Sep 17 00:00:00 2001 From: Edoardo Cavazza Date: Tue, 18 Apr 2023 17:57:51 +0200 Subject: [PATCH 2/5] fix some phpcs issues --- src/Controller/Component/CalendarComponent.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Controller/Component/CalendarComponent.php b/src/Controller/Component/CalendarComponent.php index 38fc035..ad3c8b4 100644 --- a/src/Controller/Component/CalendarComponent.php +++ b/src/Controller/Component/CalendarComponent.php @@ -3,7 +3,6 @@ namespace Chialab\Calendar\Controller\Component; -use BEdita\Core\Model\Entity\DateRange; use BEdita\Core\Model\Entity\ObjectEntity; use Cake\Controller\Component; use Cake\Database\Expression\FunctionExpression; @@ -409,8 +408,7 @@ public function findGroupedByDay(Query $query, FrozenTime $from, FrozenTime|null SORT_ASC, SORT_NATURAL ) - ->toList() - ) + ->toList()) ->toArray(); ksort($grouped, SORT_STRING); From 31f3388cb96f09c6c979b9ecd17368bbff2594ce Mon Sep 17 00:00:00 2001 From: Edoardo Cavazza Date: Tue, 18 Apr 2023 18:00:36 +0200 Subject: [PATCH 3/5] fix indentation --- .../Component/CalendarComponent.php | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/Controller/Component/CalendarComponent.php b/src/Controller/Component/CalendarComponent.php index ad3c8b4..adbce49 100644 --- a/src/Controller/Component/CalendarComponent.php +++ b/src/Controller/Component/CalendarComponent.php @@ -380,26 +380,26 @@ public function findGroupedByDay(Query $query, FrozenTime $from, FrozenTime|null ->find('closingDays') ->formatResults(function (iterable $results) use ($from, $to): iterable { $grouped = collection($results) - ->unfold(function (ObjectEntity $object) use ($from, $to): Generator { - foreach ($object->filtered_date_ranges as $dr) { - $start = (new FrozenTime($dr->start_date))->startOfDay(); - $end = (new FrozenTime($dr->end_date ?: $dr->start_date))->endOfDay(); - if ($start->gte($to) || $end->lt($from)) { - continue; + ->unfold(function (ObjectEntity $object) use ($from, $to): Generator { + foreach ($object->filtered_date_ranges as $dr) { + $start = (new FrozenTime($dr->start_date))->startOfDay(); + $end = (new FrozenTime($dr->end_date ?: $dr->start_date))->endOfDay(); + if ($start->gte($to) || $end->lt($from)) { + continue; + } + + $start = $start->max($from); + while ($start->lte($end) && $start->lte($to)) { + $day = $start->format('Y-m-d'); + $start = $start->addDay(); + $event = clone $object; + $event->set('date_ranges', [$dr]); + $event->set('filtered_date_ranges', [$dr]); + + yield compact('event', 'day'); + } } - - $start = $start->max($from); - while ($start->lte($end) && $start->lte($to)) { - $day = $start->format('Y-m-d'); - $start = $start->addDay(); - $event = clone $object; - $event->set('date_ranges', [$dr]); - $event->set('filtered_date_ranges', [$dr]); - - yield compact('event', 'day'); - } - } - }) + }) ->groupBy('day') ->map(fn (array $items, string $day): array => collection($items) ->extract('event') From d034a170c20fa7e9b82cabe87c916237a836d69e Mon Sep 17 00:00:00 2001 From: Edoardo Cavazza Date: Wed, 19 Apr 2023 08:36:06 +0200 Subject: [PATCH 4/5] use primary_date_range property --- src/Controller/Component/CalendarComponent.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Controller/Component/CalendarComponent.php b/src/Controller/Component/CalendarComponent.php index adbce49..9811c6e 100644 --- a/src/Controller/Component/CalendarComponent.php +++ b/src/Controller/Component/CalendarComponent.php @@ -393,18 +393,17 @@ public function findGroupedByDay(Query $query, FrozenTime $from, FrozenTime|null $day = $start->format('Y-m-d'); $start = $start->addDay(); $event = clone $object; - $event->set('date_ranges', [$dr]); - $event->set('filtered_date_ranges', [$dr]); + $event->set('primary_date_range', $dr); yield compact('event', 'day'); } } }) ->groupBy('day') - ->map(fn (array $items, string $day): array => collection($items) + ->map(fn (array $items): array => collection($items) ->extract('event') ->sortBy( - fn (ObjectEntity $event): string => collection($event->filtered_date_ranges)->first()->start_date->format('c'), + fn (ObjectEntity $event): string => collection($event->primary_date_range)->first()->start_date->format('c'), SORT_ASC, SORT_NATURAL ) From aeac9c9f5739ed2c51ed6360c4a9c2dd0a6f35f2 Mon Sep 17 00:00:00 2001 From: Edoardo Cavazza Date: Wed, 19 Apr 2023 10:43:47 +0200 Subject: [PATCH 5/5] Update src/Controller/Component/CalendarComponent.php Co-authored-by: Paolo Cuffiani --- src/Controller/Component/CalendarComponent.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controller/Component/CalendarComponent.php b/src/Controller/Component/CalendarComponent.php index 9811c6e..88de498 100644 --- a/src/Controller/Component/CalendarComponent.php +++ b/src/Controller/Component/CalendarComponent.php @@ -403,7 +403,7 @@ public function findGroupedByDay(Query $query, FrozenTime $from, FrozenTime|null ->map(fn (array $items): array => collection($items) ->extract('event') ->sortBy( - fn (ObjectEntity $event): string => collection($event->primary_date_range)->first()->start_date->format('c'), + fn (ObjectEntity $event): string => $event->get('primary_date_range')->start_date->format('c'), SORT_ASC, SORT_NATURAL )