@extends('layouts.app') @section('content') {{-- ── HEADER ── --}}

Call Recordings

Search, play, tag and annotate recorded calls.
Export CSV
@if(session('success'))
{{ session('success') }}
@endif {{-- ── KPI STAT CARDS ── --}}
{{ number_format($kpiTotal) }}
Total Recordings
@if($totalTrend !== null)
{{ $totalTrend >= 0 ? '↑' : '↓' }} {{ abs($totalTrend) }}% vs last period
@endif
{{ number_format($kpiAnswered) }}
Answered Recordings
{{ $kpiAnsweredPct }}% of total
{{ $kpiDuration }}
Total Duration
{{ number_format($kpiAwaiting) }}
Awaiting Transcription
{{ $kpiAwaitPct }}% of total
{{-- ── FILTERS ── --}}
{{-- Date Presets --}}
@foreach(['Today' => 0, 'Yesterday' => 1, 'This Week' => 7, 'Last 7 Days' => 7, 'This Month' => 30, 'Custom' => null] as $label => $days) @php if ($days === null) { $active = false; // Custom shown always } elseif ($days === 0) { $active = $from === now()->format('Y-m-d') && $to === now()->format('Y-m-d'); } else { $active = $from === now()->subDays($days)->format('Y-m-d') && $to === now()->format('Y-m-d'); } @endphp @endforeach
@foreach($allTags as $t)
Reset
{{-- ── MAIN CONTENT: TABLE + QUICK PREVIEW ── --}}
{{-- Table --}}
@if($rows->isEmpty())
No recordings match your filters.
@else
@foreach($rows as $r) @php $durFmt = gmdate($r->duration >= 3600 ? 'H:i:s' : 'i:s', (int)$r->duration); $dispClass = match($r->disposition ?? '') { 'ANSWERED' => 'rec-disp-ans', 'NO ANSWER' => 'rec-disp-no', 'BUSY','FAILED' => 'rec-disp-busy', default => 'rec-disp-no', }; $dirClass = match($r->direction ?? '') { 'OUT' => 'rec-dir-out', 'IN' => 'rec-dir-in', default => 'rec-dir-int', }; $sentClass = match($r->sentiment ?? '') { 'positive' => 'rec-sent-pos', 'negative' => 'rec-sent-neg', default => 'rec-sent-neu', }; $info = json_encode([ 'calldate' => $r->calldate, 'src' => $r->src, 'dst' => $r->dst, 'src_name' => $r->src_name, 'dst_name' => $r->dst_name, 'duration' => (int)$r->duration, 'durFmt' => $durFmt, 'disposition' => $r->disposition, 'direction' => $r->direction, 'extension' => $r->extension, 'extension_name' => $r->extension_name, 'filename' => $r->recordingfile, ]); @endphp @endforeach
Date / Time ↓ Direction Ext From To Duration Status Transcript Sentiment Tags
{{ \Illuminate\Support\Carbon::parse($r->calldate)->format('Y-m-d H:i:s') }} {{ $r->direction ?: '—' }} {{ $r->extension }} @if($r->extension_name)
{{ $r->extension_name }}
@endif
{{ $r->src }} @if($r->src_name)
{{ $r->src_name }}
@endif
{{ $r->dst }} @if($r->dst_name)
{{ $r->dst_name }}
@endif
{{ $durFmt }} {{ $r->disposition }} @if(!empty($r->transcript)) Transcribed @elseif($r->file_exists) Pending @else — @endif @if($r->sentiment) {{ ucfirst($r->sentiment) }} @else — @endif @foreach(array_filter(array_map('trim', explode(',', (string)($r->tags ?? '')))) as $t) {{ $t }} @endforeach @if(!$r->file_exists) missing @else @endif
{{-- Pagination + count --}}
Show entries  |  Showing {{ $rows->firstItem() }} to {{ $rows->lastItem() }} of {{ number_format($rows->total()) }} entries
{{ $rows->links() }}
@endif
{{-- ── QUICK PREVIEW PANEL (slides in from right) ── --}}
{{-- header --}}
Quick Preview
{{-- call info bar --}}
OUT
Date/Time
Extension
Duration
{{-- waveform + transport --}}
0:00 / 0:00
{{-- meta tabs --}}
No transcript available.
No summary available.
@csrf
Comma-separated or press Enter to add
{{-- actions --}}
Download @canAccess('recordings.email') @endcanAccess
@csrf @method('DELETE')
{{-- Backdrop --}} @include('recordings._action_modals') @push('plugin-scripts') @endpush @endsection