@extends('admin.layouts.app') @section('title', $group->displayName() . ' — ' . __('admin.brand.name')) @section('page_title', __('admin.campaign_groups.title')) @push('styles') @endpush @php // `admin` guard — @can resolves the default guard and would always be // false. Visibility only; the routes hold the real gate. $me = auth('admin')->user(); $canEdit = $me?->can('campaign-groups.edit') ?? false; $canDelete = $me?->can('campaign-groups.delete') ?? false; @endphp @section('content') {{-- Named `actions` slot — the default slot is discarded by the component. --}}
@if ($canEdit) {{ __('admin.campaign_groups.show.edit') }} @endif @if ($canDelete)
@csrf @method('DELETE')
@endif {{ __('admin.campaign_groups.title') }}
@include('admin.partials.flash')
@if ($filterError)
{{ __('admin.campaign_groups.preview.error') }}
@endif
{{-- ── Details + rules ─────────────────────────────────────── --}}

{{ __('admin.campaign_groups.sections.meta') }}

{{ __('admin.campaign_groups.source.label') }}
{{ __('admin.campaign_groups.source.'.$group->source()) }}
{{ __('admin.campaign_groups.audience.label') }}
{{ __('admin.campaign_groups.audience.' . $group->audience_type) }}
{{ __('admin.campaign_groups.index.col_state') }}
{{ $group->is_active ? __('admin.campaign_groups.index.state_active') : __('admin.campaign_groups.index.state_inactive') }}
@if ($group->creator)
{{ __('admin.campaign_groups.show.created_by') }}
{{ $group->creator->name ?? '—' }}
@endif @if ($group->updater)
{{ __('admin.campaign_groups.show.updated_by') }}
{{ $group->updater->name ?? '—' }}
@endif
{{ __('admin.campaign_groups.show.created_at') }}
{{ $group->created_at?->format('Y-m-d H:i') ?? '—' }}
{{ __('admin.campaign_groups.show.updated_at') }}
{{ $group->updated_at?->format('Y-m-d H:i') ?? '—' }}

{{ __('admin.campaign_groups.summary.title') }}

@include('admin.campaign-groups.partials.summary-node', ['node' => $summaryTree])
{{-- ── Live audience ───────────────────────────────────────── --}} {{-- The wrapper is the grid item; the card inside it is absolutely positioned so this column can never out-grow the Details + Filter summary stack. See `.cgs-audience` in the styles above. --}}

{{ __('admin.campaign_groups.show.authoritative_count') }}

{{ $count === null ? '—' : number_format($count) }} {{ __('admin.campaign_groups.preview.count') }} {{-- The list below is capped, so when it cannot show the whole audience say so — without a pager, a silently truncated table reads as the complete set. --}} @if ($rows !== null && $count !== null && $rows->count() < $count) {{ __('admin.campaign_groups.show.list_truncated', ['shown' => number_format($rows->count())]) }} @endif
@if ($group->isCrmAudience()) @if (count($remoteRows) === 0)
{{ $filterError ? __('admin.campaign_groups.preview.error_hint') : __('admin.campaign_groups.preview.empty') }}
@else
@foreach($remoteRows as $row)@endforeach
{{ __('admin.campaign_groups.preview.col_name') }}{{ __('admin.campaign_groups.preview.col_email') }}{{ __('admin.campaign_groups.preview.col_phone') }}Source
{{ $row['name'] ?? '—' }}{{ $row['email'] ?? '—' }} {{ $row['phone'] ?? '—' }}CRM
@endif @elseif ($rows === null)
{{ __('admin.campaign_groups.preview.error_hint') }}
@elseif ($rows->isEmpty())
{{ __('admin.campaign_groups.preview.empty') }}

{{ __('admin.campaign_groups.preview.empty_hint') }}

@else
@foreach ($rows as $row) @php $isInvestor = $group->isInvestorAudience(); $name = $isInvestor ? (app()->getLocale() === 'ar' ? ($row->full_name_ar ?: $row->full_name_en) : ($row->full_name_en ?: $row->full_name_ar)) : (app()->getLocale() === 'ar' ? ($row->name ?: $row->name_en) : ($row->name_en ?: $row->name)); $url = $isInvestor ? route('admin.investors.show', $row->id) : route('admin.startups.show', $row->id); @endphp @endforeach
{{ __('admin.campaign_groups.preview.col_name') }} {{ __('admin.campaign_groups.preview.col_email') }} {{ __('admin.campaign_groups.preview.col_phone') }} {{ __('admin.campaign_groups.preview.col_group') }} {{ __('admin.campaign_groups.preview.col_status') }}
{{ $name ?: '—' }} {{ $row->email ?: '—' }} {{ $row->phone_number ?: '—' }} {{ $row->group?->name ?: '—' }} {{ app()->getLocale() === 'ar' ? ($row->statusOption?->name_ar ?: $row->statusOption?->name_en ?: '—') : ($row->statusOption?->name_en ?: $row->statusOption?->name_ar ?: '—') }}
@endif

{{ __('admin.campaign_groups.exclusions.title') }}

{{ number_format($exclusions->total()) }}
@if($exclusions->isEmpty())
{{ __('admin.campaign_groups.exclusions.empty') }}
@else
@foreach($exclusions as $exclusion)@endforeach
IDSourceEntityExcluded atBy
{{ $exclusion->external_id }}{{ strtoupper($exclusion->source) }}{{ $exclusion->entity_type }} {{ $exclusion->excluded_at?->format('Y-m-d H:i') }}{{ $exclusion->excludedBy?->name ?? '—' }} @if($canEdit)
@csrf @method('DELETE')
@endif
{{ $exclusions->links() }} @endif
{{ number_format($analytics['campaigns']) }}{{ __('admin.campaign_groups.analytics.total_campaigns') }}
{{ number_format($analytics['resolved']) }}{{ __('admin.campaign_groups.analytics.resolved') }}
{{ number_format($analytics['successful']) }}{{ __('admin.campaign_groups.analytics.successful') }}
{{ $analytics['success_rate'] === null ? '—' : $analytics['success_rate'].'%' }}{{ __('admin.campaign_groups.analytics.success_rate') }}
{{ number_format($analytics['partial']) }}{{ __('admin.campaign_groups.analytics.partial') }}
{{ number_format($analytics['failed']) }}{{ __('admin.campaign_groups.analytics.failed') }}
{{ number_format($analytics['pending']) }}{{ __('admin.campaign_groups.analytics.pending') }}
{{ number_format($analytics['skipped']) }}{{ __('admin.campaign_groups.analytics.skipped') }}

{{ __('admin.campaign_groups.analytics.channel_breakdown') }}

@foreach($analytics['channels'] as $channel => $counts)@endforeach
{{ __('admin.campaign_groups.analytics.channels') }} {{ __('admin.campaign_groups.analytics.successful') }} {{ __('admin.campaign_groups.analytics.failed') }} {{ __('admin.campaign_groups.analytics.pending') }} {{ __('admin.campaign_groups.analytics.skipped') }}
{{ ucfirst($channel) }}{{ $counts['successful'] }}{{ $counts['failed'] }}{{ $counts['pending'] }}{{ $counts['skipped'] }}

{{ __('admin.campaign_groups.analytics.history') }}

@if($campaignHistory->isEmpty())
{{ __('admin.campaign_groups.analytics.empty') }}
@else
@foreach($campaignHistory as $campaign) @php($r=$campaign->group_delivery_rollup)@endforeach
{{ __('admin.campaign_groups.analytics.campaign') }}{{ __('admin.campaign_groups.analytics.channels') }}{{ __('admin.campaign_groups.analytics.status') }}{{ __('admin.campaign_groups.analytics.resolved') }}{{ __('admin.campaign_groups.analytics.successful') }}{{ __('admin.campaign_groups.analytics.partial') }}{{ __('admin.campaign_groups.analytics.failed') }}{{ __('admin.campaign_groups.analytics.pending') }}{{ __('admin.campaign_groups.analytics.skipped') }}{{ __('admin.campaign_groups.analytics.executed') }}
{{ $campaign->title }}
{{ $campaign->creator?->name }}
{{ implode(', ', (array)$campaign->channels) }}{{ $campaign->status }} {{ $r['resolved'] }}{{ $r['successful'] }}{{ $r['partial'] }}{{ $r['failed'] }}{{ $r['pending'] }}{{ $r['skipped'] }} {{ ($campaign->sent_at ?? $campaign->created_at)?->format('Y-m-d H:i') }}
{{ $campaignHistory->links() }} @endif

{{ __('admin.campaign_groups.analytics.attribution') }}

@endsection