|
9 | 9 | use Carbon\Carbon;
|
10 | 10 | use Illuminate\Database\Eloquent\Casts\Attribute;
|
11 | 11 | use Illuminate\Database\Eloquent\Model;
|
12 |
| -use Illuminate\Support\Arr; |
| 12 | +use Illuminate\Support\Collection; |
13 | 13 | use Illuminate\Support\Facades\App;
|
14 | 14 | use Illuminate\Support\Str;
|
15 | 15 | use Spatie\Activitylog\LogOptions;
|
@@ -255,10 +255,10 @@ public function saveCourseTimes($newCourseTimes)
|
255 | 255 | ->where('end', Carbon::parse($courseTime['end'])->toTimeString())
|
256 | 256 | ->count() == 0) {
|
257 | 257 | $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 | + ]); |
262 | 262 | }
|
263 | 263 | }
|
264 | 264 | }
|
@@ -304,40 +304,37 @@ public function getCourseTimesAttribute()
|
304 | 304 | }
|
305 | 305 |
|
306 | 306 | $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 = []; |
313 | 307 | foreach ($courseTimes->groupBy('timeString') as $groupedCourseTimes) {
|
314 | 308 | $currentSeq = [];
|
315 | 309 | foreach ($groupedCourseTimes as $courseTime) {
|
316 | 310 | $prevCourseTime = end($currentSeq);
|
317 | 311 | if ($prevCourseTime && ($courseTime->day - $prevCourseTime->day) !== 1) {
|
318 |
| - $daySequences[] = $currentSeq; |
319 | 312 | $currentSeq = [];
|
320 | 313 | }
|
321 | 314 | $currentSeq[] = $courseTime;
|
| 315 | + $courseTime->firstOfSeq = reset($currentSeq); |
322 | 316 | }
|
323 |
| - $daySequences[] = $currentSeq; |
324 | 317 | }
|
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 | + |
326 | 322 | $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(); |
330 | 331 | $result[] = "{$firstDay->dayString} - {$lastDay->dayString} {$firstDay->timeString}";
|
331 | 332 | }
|
332 | 333 |
|
333 |
| - // grouping by day what's left |
334 | 334 | // 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(' / ')}"; |
341 | 338 | }
|
342 | 339 |
|
343 | 340 | return implode(' | ', $result);
|
|
0 commit comments