{{-- Live crawl progress bar (polls every 3s) --}} @livewire('ekat-crawl-progress') {{-- Brand header --}} @php $crawling = !empty($this->recentRuns) && ($this->recentRuns[0]->status ?? '') === 'running'; @endphp
Festool
Festool eKat {{ $crawling ? 'Crawling' : 'Idle' }}
Festool exploded parts catalogue — tools, diagrams & spare parts
Browse Catalogue
{{-- Stats --}}
{{ number_format($this->stats['categories']) }}
Categories
{{ number_format($this->stats['tools']) }}
Tools
{{ number_format($this->stats['diagrams']) }}
Diagrams
{{ number_format($this->stats['parts']) }}
Parts
{{-- Recent crawl runs --}}
Recent crawl runs
@if (empty($this->recentRuns))
No crawl runs yet. Click Start Full Crawl to begin.
@else @foreach ($this->recentRuns as $run) @php $total = $run['tools_total'] + $run['diagrams_total']; $done = $run['tools_done'] + $run['diagrams_done']; $pct = $total > 0 ? round($done / $total * 100) : 0; $started = $run['started_at'] ? \Carbon\Carbon::parse($run['started_at']) : null; $ended = $run['completed_at'] ? \Carbon\Carbon::parse($run['completed_at']) : null; $duration = $started && $ended ? $started->diffForHumans($ended, true) : ($started ? $started->diffForHumans() : '—'); $scopeLabel = ($run['tool_limit'] ?? 0) > 0 ? 'First ' . $run['tool_limit'] . ' tools' : 'Full'; $scopeLabel .= ($run['skip_images'] ?? false) ? ' · no images' : ''; @endphp @endforeach
# Status Scope Progress Tools Diagrams Step Started Duration
#{{ $run['id'] }} {{ ucfirst($run['status']) }} {{ $scopeLabel }}
{{ $run['tools_done'] }} / {{ $run['tools_total'] ?: '?' }} {{ $run['diagrams_done'] }} / {{ $run['diagrams_total'] ?: '?' }} {{ $run['current_step'] ?? '—' }} {{ $started?->format('d M H:i') ?? '—' }} {{ $duration }}
@endif
{{-- Latest run error (if any) --}} @if ($this->latestRun?->status === 'failed' && $this->latestRun->error_message)
Last crawl failed
{{ $this->latestRun->error_message }}
@if ($this->latestRun->resume_cursor)
Progress was saved — use Resume Crawl to continue from where it stopped.
@endif
@endif