9
9
use Carbon \Carbon ;
10
10
use Illuminate \Database \Eloquent \Casts \Attribute ;
11
11
use Illuminate \Database \Eloquent \Model ;
12
+ use Illuminate \Support \Collection ;
12
13
use Illuminate \Support \Facades \App ;
13
14
use Illuminate \Support \Str ;
14
15
use Spatie \Activitylog \LogOptions ;
@@ -254,10 +255,10 @@ public function saveCourseTimes($newCourseTimes)
254
255
->where ('end ' , Carbon::parse ($ courseTime ['end ' ])->toTimeString ())
255
256
->count () == 0 ) {
256
257
$ this ->times ()->create ([
257
- 'day ' => $ courseTime ['day ' ],
258
- 'start ' => Carbon::parse ($ courseTime ['start ' ])->toTimeString (),
259
- 'end ' => Carbon::parse ($ courseTime ['end ' ])->toTimeString (),
260
- ]);
258
+ 'day ' => $ courseTime ['day ' ],
259
+ 'start ' => Carbon::parse ($ courseTime ['start ' ])->toTimeString (),
260
+ 'end ' => Carbon::parse ($ courseTime ['end ' ])->toTimeString (),
261
+ ]);
261
262
}
262
263
}
263
264
}
@@ -274,7 +275,6 @@ public function saveCourseTimes($newCourseTimes)
274
275
*/
275
276
public function getCourseTimesAttribute ()
276
277
{
277
- $ parsedCourseTimes = [];
278
278
// TODO localize these
279
279
$ daysInitials = [
280
280
__ ('Sun ' ),
@@ -293,28 +293,51 @@ public function getCourseTimesAttribute()
293
293
$ courseTimes = $ this ->children ->first ()->times ;
294
294
}
295
295
296
- if ($ courseTimes ) {
297
- foreach ($ courseTimes as $ courseTime ) {
298
- $ initial = $ daysInitials [$ courseTime ->day ];
296
+ foreach ($ courseTimes as $ courseTime ) {
297
+ $ timeString = sprintf (
298
+ '%s - %s ' ,
299
+ Carbon::parse ($ courseTime ->start )->locale (App::getLocale ())->isoFormat ('LT ' ),
300
+ Carbon::parse ($ courseTime ->end )->locale (App::getLocale ())->isoFormat ('LT ' )
301
+ );
302
+ $ courseTime ->timeString = $ timeString ;
303
+ $ courseTime ->dayString = $ daysInitials [$ courseTime ->day ];
304
+ }
299
305
300
- if (! isset ($ parsedCourseTimes [$ initial ])) {
301
- $ parsedCourseTimes [$ initial ] = [];
306
+ $ courseTimes = $ courseTimes ->sortBy ('day ' );
307
+ foreach ($ courseTimes ->groupBy ('timeString ' ) as $ groupedCourseTimes ) {
308
+ $ currentSeq = [];
309
+ foreach ($ groupedCourseTimes as $ courseTime ) {
310
+ $ prevCourseTime = end ($ currentSeq );
311
+ if ($ prevCourseTime && ($ courseTime ->day - $ prevCourseTime ->day ) !== 1 ) {
312
+ $ currentSeq = [];
302
313
}
303
-
304
- $ parsedCourseTimes [$ initial ][] = sprintf (
305
- '%s - %s ' ,
306
- Carbon::parse ($ courseTime ->start )->locale (App::getLocale ())->isoFormat ('LT ' ),
307
- Carbon::parse ($ courseTime ->end )->locale (App::getLocale ())->isoFormat ('LT ' )
308
- );
314
+ $ currentSeq [] = $ courseTime ;
315
+ $ courseTime ->firstOfSeq = reset ($ currentSeq );
309
316
}
310
317
}
311
318
312
- $ result = '' ;
313
- foreach ($ parsedCourseTimes as $ day => $ times ) {
314
- $ result .= $ day .' ' .implode (' / ' , $ times ).' | ' ;
319
+ $ groups = $ courseTimes ->groupBy (fn (CourseTime $ courseTime ) => $ courseTime ->firstOfSeq ->id )
320
+ ->groupBy (fn (Collection $ seqGroup ) => $ seqGroup ->count () > 1 ? 'multi_days ' : 'multi_times ' );
321
+
322
+ $ result = [];
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 ();
331
+ $ result [] = "{$ firstDay ->dayString } - {$ lastDay ->dayString } {$ firstDay ->timeString }" ;
332
+ }
333
+
334
+ // Mon 10:00 AM - 11:00 AM / 11:30 AM - 12:45 PM
335
+ foreach (collect ($ groups ->get ('multi_times ' , []))->flatten ()->groupBy ('day ' ) as $ group ) {
336
+ $ firstDay = $ group ->first ();
337
+ $ result [] = "{$ firstDay ->dayString } {$ group ->pluck ('timeString ' )->join (' / ' )}" ;
315
338
}
316
339
317
- return trim ( $ result , ' | ' );
340
+ return implode ( ' | ' , $ result );
318
341
}
319
342
320
343
public function getCoursePeriodNameAttribute ()
0 commit comments