Skip to content

Commit f4be544

Browse files
Add spanning_start and spanning_end (#152)
Co-authored-by: edalzell <erin@silentz.co>
1 parent f0d8193 commit f4be544

2 files changed

Lines changed: 55 additions & 8 deletions

File tree

src/Tags/Events.php

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Carbon\CarbonInterface;
88
use Carbon\CarbonPeriod;
99
use Carbon\CarbonPeriodImmutable;
10+
use Closure;
1011
use Illuminate\Pagination\Paginator;
1112
use Illuminate\Support\Collection;
1213
use Statamic\Contracts\Query\Builder;
@@ -41,14 +42,14 @@ public function calendar(): Collection
4142
$month = $this->params->get('month', now()->englishMonth);
4243
$year = $this->params->get('year', now()->year);
4344

44-
$from = parse_date($month . ' ' . $year)->startOfMonth()->startOfWeek();
45-
$to = parse_date($month . ' ' . $year)->endOfMonth()->endOfWeek();
45+
$from = parse_date($month.' '.$year)->startOfMonth()->startOfWeek();
46+
$to = parse_date($month.' '.$year)->endOfMonth()->endOfWeek();
4647

4748
$occurrences = $this
4849
->generator()
4950
->between(from: $from, to: $to)
5051
->groupBy($this->spanningDays())
51-
->map(fn(EntryCollection $occurrences, string $date) => $this->day(date: $date, occurrences: $occurrences));
52+
->map(fn (EntryCollection $occurrences, string $date) => $this->day(date: $date, occurrences: $occurrences));
5253

5354
$days = $this->output($this->makeEmptyDates(from: $from, to: $to)->merge($occurrences)->values());
5455

@@ -135,12 +136,27 @@ public function upcoming(): EntryCollection|array
135136
return $this->output($occurrences->take($limit));
136137
}
137138

139+
private function addSpanningStartEnd(string $date, EntryCollection $occurrences): EntryCollection
140+
{
141+
return $occurrences->map(function (Entry $occurrence) use ($date) {
142+
if (! $occurrence->spanning) {
143+
return $occurrence;
144+
}
145+
146+
$carbonDate = Carbon::parse($date)->shiftTimezone($occurrence->start->timezone);
147+
$occurrence
148+
->setSupplement('spanning_start', $occurrence->start->isSameDay($carbonDate))
149+
->setSupplement('spanning_end', $occurrence->end->isSameDay($carbonDate));
150+
151+
return clone $occurrence;
152+
});
153+
}
154+
138155
private function day(string $date, EntryCollection $occurrences): array
139156
{
140157
return [
141158
'date' => $date,
142-
'dates' => $occurrences,
143-
'occurrences' => $occurrences,
159+
'occurrences' => $this->addSpanningStartEnd($date, $occurrences),
144160
];
145161
}
146162

@@ -244,15 +260,15 @@ private function parseTermIds(string $key, array|Builder|string $terms): array
244260
->all();
245261
}
246262

247-
private function spanningDays(): \Closure
263+
private function spanningDays(): Closure
248264
{
249265
return function (Entry $occurrence) {
250266
$spanningDays = CarbonPeriodImmutable::between(
251267
$occurrence->start->startOfDay(),
252268
$occurrence->end->endOfDay()
253269
)->toArray();
254270

255-
return collect($spanningDays)->map(fn(CarbonImmutable $date) => $date->toDateString())->all();
271+
return collect($spanningDays)->map(fn (CarbonImmutable $date) => $date->toDateString())->all();
256272
};
257273
}
258274
}

tests/Tags/EventsTest.php

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@
9696
$occurrences = $this->tag->calendar();
9797

9898
expect($occurrences)->toHaveCount(42);
99-
expect(Arr::get($occurrences, '5.dates'))->toHaveCount(2);
99+
expect(Arr::get($occurrences, '5.occurrences'))->toHaveCount(2);
100100
expect(Arr::get($occurrences, '6.no_results'))->toBeTrue();
101101
});
102102

@@ -456,3 +456,34 @@
456456
expect($occurrences)->toHaveCount(1)
457457
->first()->spanning->toBeTrue();
458458
});
459+
460+
it('sets "spanning-start" and "spanning-end"', function () {
461+
Carbon::setTestNow(Carbon::parse('April 16 10:00am'));
462+
463+
Entry::make()
464+
->collection('events')
465+
->slug('single-event')
466+
->id('single-event')
467+
->data([
468+
'title' => 'Event',
469+
'start_date' => Carbon::now()->toDateString(),
470+
'start_time' => '11:00',
471+
'end_time' => '23:00',
472+
])->save();
473+
474+
$this->tag
475+
->setContext([])
476+
->setParameters(['timezone' => 'Europe/Kyiv']);
477+
478+
$days = $this->tag->calendar();
479+
$firstSpanningOccurrence = $days[17]['occurrences'][0];
480+
$secondSpanningOccurrence = $days[18]['occurrences'][0];
481+
482+
expect($firstSpanningOccurrence)
483+
->spanning_start->toBeTrue()
484+
->spanning_end->toBeFalse();
485+
486+
expect($secondSpanningOccurrence)
487+
->spanning_start->toBeFalse()
488+
->spanning_end->toBeTrue();
489+
});

0 commit comments

Comments
 (0)