Skip to content

Commit e99b07e

Browse files
committed
Fix: Optimize course times display
#237
1 parent 69ba452 commit e99b07e

File tree

1 file changed

+21
-24
lines changed

1 file changed

+21
-24
lines changed

app/Models/Course.php

+21-24
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
use Carbon\Carbon;
1010
use Illuminate\Database\Eloquent\Casts\Attribute;
1111
use Illuminate\Database\Eloquent\Model;
12-
use Illuminate\Support\Arr;
12+
use Illuminate\Support\Collection;
1313
use Illuminate\Support\Facades\App;
1414
use Illuminate\Support\Str;
1515
use Spatie\Activitylog\LogOptions;
@@ -255,10 +255,10 @@ public function saveCourseTimes($newCourseTimes)
255255
->where('end', Carbon::parse($courseTime['end'])->toTimeString())
256256
->count() == 0) {
257257
$this->times()->create([
258-
'day' => $courseTime['day'],
259-
'start' => Carbon::parse($courseTime['start'])->toTimeString(),
260-
'end' => Carbon::parse($courseTime['end'])->toTimeString(),
261-
]);
258+
'day' => $courseTime['day'],
259+
'start' => Carbon::parse($courseTime['start'])->toTimeString(),
260+
'end' => Carbon::parse($courseTime['end'])->toTimeString(),
261+
]);
262262
}
263263
}
264264
}
@@ -304,40 +304,37 @@ public function getCourseTimesAttribute()
304304
}
305305

306306
$courseTimes = $courseTimes->sortBy('day');
307-
308-
// Instead of showing this:
309-
// Mon 9:00 - 5:00 | Tue 9:00 - 5:00 | Wed 9:00 - 5:00 | Thu 9:00 - 5:00 | Fri 9:00 - 5:00
310-
// we could show:
311-
// Mon - Fri 9:00 - 5:00
312-
$daySequences = [];
313307
foreach ($courseTimes->groupBy('timeString') as $groupedCourseTimes) {
314308
$currentSeq = [];
315309
foreach ($groupedCourseTimes as $courseTime) {
316310
$prevCourseTime = end($currentSeq);
317311
if ($prevCourseTime && ($courseTime->day - $prevCourseTime->day) !== 1) {
318-
$daySequences[] = $currentSeq;
319312
$currentSeq = [];
320313
}
321314
$currentSeq[] = $courseTime;
315+
$courseTime->firstOfSeq = reset($currentSeq);
322316
}
323-
$daySequences[] = $currentSeq;
324317
}
325-
$daySequences = array_filter($daySequences, fn(array $sequence) => count($sequence) > 1);
318+
319+
$groups = $courseTimes->groupBy(fn (CourseTime $courseTime) => $courseTime->firstOfSeq->id)
320+
->groupBy(fn (Collection $seqGroup) => $seqGroup->count() > 1 ? 'multi_days' : 'multi_times');
321+
326322
$result = [];
327-
foreach ($daySequences as $sequence) {
328-
$firstDay = reset($sequence);
329-
$lastDay = end($sequence);
323+
324+
// Instead of showing this:
325+
// Mon 9:00 - 5:00 | Tue 9:00 - 5:00 | Wed 9:00 - 5:00 | Thu 9:00 - 5:00 | Fri 9:00 - 5:00
326+
// we could show:
327+
// Mon - Fri 9:00 - 5:00
328+
foreach (collect($groups->get('multi_days', [])) as $group) {
329+
$firstDay = $group->first();
330+
$lastDay = $group->last();
330331
$result[] = "{$firstDay->dayString} - {$lastDay->dayString} {$firstDay->timeString}";
331332
}
332333

333-
// grouping by day what's left
334334
// Mon 10:00 AM - 11:00 AM / 11:30 AM - 12:45 PM
335-
$remainingCourseTimes = $courseTimes->diff(Arr::flatten($daySequences))
336-
->groupBy('day');
337-
foreach ($remainingCourseTimes as $timeSequence) {
338-
$firstDay = $timeSequence->first();
339-
$times = $timeSequence->pluck('timeString');
340-
$result[] = "{$firstDay->dayString} " . implode(' / ', $times->all());
335+
foreach (collect($groups->get('multi_times', []))->flatten()->groupBy('day') as $group) {
336+
$firstDay = $group->first();
337+
$result[] = "{$firstDay->dayString} {$group->pluck('timeString')->join(' / ')}";
341338
}
342339

343340
return implode(' | ', $result);

0 commit comments

Comments
 (0)