@php $pageTracks = []; $trackPositions = []; $trackCount = 0; if ($page->enable_tracks && $page->tracks) { $pageTracks = $page->tracks; foreach ($pageTracks as $trackNum => $trackName) { $trackPositions[$trackName] = (int) $trackNum; } $trackCount = max(array_map('intval', array_keys($pageTracks))); } // Build a single chronologically-ordered timeline of items. // Each entry is either a tracked time-group (rendered as a multi-column grid) // or a single non-tracked programme — interleaved so dates stay in order. $timeline = []; $trackedTimeGroups = []; foreach ($programmes as $programme) { if ($trackCount > 0 && $programme->track && isset($trackPositions[$programme->track])) { $timeKey = $programme->starts_at->setTimezone('Europe/London')->format('Y-m-d H:i'); $trackedTimeGroups[$timeKey][] = $programme; } else { $timeline[] = [ 'sort' => $programme->starts_at->getTimestamp(), 'type' => 'non-tracked', 'programme' => $programme, ]; } } foreach ($trackedTimeGroups as $group) { // Sort by track column so CSS grid places cards left-to-right without leaving gaps. usort($group, fn($a, $b) => $trackPositions[$a->track] <=> $trackPositions[$b->track]); $timeline[] = [ 'sort' => $group[0]->starts_at->getTimestamp(), 'type' => 'track-group', 'group' => $group, ]; } usort($timeline, fn($a, $b) => $a['sort'] <=> $b['sort']); $timelineLast = count($timeline) - 1; @endphp @if (count($programmes) > 0)
@foreach ($timeline as $itemIdx => $item) @if ($item['type'] === 'track-group')
@foreach ($item['group'] as $programme) @php $col = $trackPositions[$programme->track]; @endphp
{{ $programme->track }} {{ strtoupper($programme->starts_at->setTimezone('Europe/London')->format('jS F')) }} {{ $programme->starts_at->setTimezone('Europe/London')->format('H:i') }} - {{ $programme->ends_at->setTimezone('Europe/London')->format('H:i') }}

{{ $programme->title }}

@if ($programme->description)
@if (Str::wordCount($programme->description) > 20) @if ($open !== $programme->id)

{{ Str::words($programme->description, 20, '...') }}

@else {!! Str::markdown($programme->description ?? '') !!} @endif @else {!! Str::markdown($programme->description ?? '') !!} @endif
@endif @if ($programme->speakers()->count() > 0)
@if ($trackCount == 1)
@foreach($programme->speakers()->orderBy('programme_speaker.chair', 'DESC')->get() as $speaker)
{{ $speaker->name }}
@if ($speaker->pivot->chair) Chair @endif

{{ $speaker->name }}

{{ $speaker->company }}{{ $speaker->position }}

@endforeach
@elseif ($trackCount == 2)
@foreach($programme->speakers()->orderBy('programme_speaker.chair', 'DESC')->get() as $speaker)
{{ $speaker->name }}
@if ($speaker->pivot->chair) Chair @endif

{{ $speaker->name }}

{{ $speaker->company }}{{ $speaker->position }}

@endforeach
@else
@foreach($programme->speakers()->orderBy('programme_speaker.chair', 'DESC')->get() as $speaker)
{{ $speaker->name }} @if ($speaker->pivot->chair) Chair @endif

{{ $speaker->name }}

{{ $speaker->company }}

@endforeach
@endif
@endif @if ($calendars->contains('programme_id', $programme->id)) @else @endif
@endforeach
@else @php $programme = $item['programme']; @endphp
{{ strtoupper($programme->starts_at->setTimezone('Europe/London')->format('jS F')) }}
{{ $programme->starts_at->setTimezone('Europe/London')->format('H:i') }} - {{ $programme->ends_at->setTimezone('Europe/London')->format('H:i')}}

{{$programme->title}}

@if ($programme->description)
{!! Str::markdown($programme->description ?? '') !!}
@endif @if ($programme->speakers()->count() > 0)
@foreach($programme->speakers()->orderBy('programme_speaker.chair', 'DESC')->get() as $speaker)
{{ $speaker->name }}
@if ($speaker->pivot->chair) Chair @endif

{{ $speaker->name }}

{{ $speaker->company }}{{ $speaker->position }}

@endforeach
@endif @if ($calendars->contains('programme_id', $programme->id)) @else @endif
@endif @if ($itemIdx < $timelineLast)
@endif @endforeach
@endif