{{-- HEADER --}}

Client Journey

@if($this->milestones->isEmpty())
No claim is linked to this client, so there is no journey to show yet.
@else {{-- RAIL --}}
@foreach($this->milestones as $milestone) @php $prevComplete = $loop->index > 0 && $this->milestones[$loop->index - 1]->isComplete(); $countdownColor = match ($milestone->state) { 'overdue', 'closed', 'cancelled' => 'text-danger', 'due_soon' => 'text-warning', default => 'text-primary', }; $tooltip = $milestone->label . ($milestone->achievedAt ? ' · Completed ' . $milestone->achievedAt->format('d M Y') : ' · ' . ucfirst(str_replace('_', ' ', $milestone->state))) . ($milestone->achievedBy ? ' · by ' . $milestone->achievedBy : '') . ($milestone->source ? ' · ' . $milestone->source : ''); @endphp
{{ $milestone->label }}
@if($milestone->achievedAt) {{ $milestone->achievedAt->format('d M') }} @elseif($milestone->countdown) {{ $milestone->countdown }} @endif
{{-- Terminal states truncate the rail: the story stopped here. --}} @if($milestone->isTerminal()) @break @endif @endforeach
@endif
{{-- OFFCANVAS : FULL TIMELINE --}}
Journey Timeline
    @foreach($this->milestones as $milestone)
  • {{ $milestone->label }} @if($milestone->achievedAt) {{ $milestone->achievedAt->format('d M Y') }} @else {{ ucfirst(str_replace('_', ' ', $milestone->state)) }} @endif
    @if($milestone->achievedBy)
    by {{ $milestone->achievedBy }}
    @endif @if($milestone->narrative)
    {{ $milestone->narrative }}
    @endif
    @if($milestone->source) {{ $milestone->source }} @endif @if($milestone->countdown && ! $milestone->achievedAt) {{ $milestone->countdown }} @endif
  • @endforeach

Milestones are derived automatically from calls, e-sign, statuses and key dates. No data is stored separately.

@if($showTimeline)
@endif {{-- Scoped presentation for the rail. Deterministic, no JS. --}}