{{-- resources/views/superadmin/proactive/sessions-monitor.blade.php --}} @extends('layouts.superadmin') @section('title','ProActive — مراقبة المواعيد والمدة') @section('page-title','⏱️ مراقبة مواعيد ProActive والمدة') @section('content') @php $filter = $filter ?? []; $tz = $tz ?? config('app.timezone','Asia/Jerusalem'); $reportStats = $reportStats ?? collect(); $initialStep = (int) request('step', 1); $initialStep = max(1, min(4, $initialStep)); $hasFilters = !empty(array_filter($filter ?? [], fn($v) => !is_null($v) && $v !== '')); $pageItems = ($rows instanceof \Illuminate\Pagination\AbstractPaginator) ? $rows->getCollection() : collect($rows); $withReports = $pageItems->filter(function($it) use ($reportStats){ $rep = $reportStats->get($it->id); return (int)($rep->reports_count ?? 0) > 0; })->count(); $coverage = $pageItems->count() > 0 ? (int) round(($withReports / $pageItems->count()) * 100) : 0; $longestItem = $pageItems->sortByDesc(function($it){ return (float)($it->runtime_minutes ?? 0); })->first(); $topLeader = $pageItems ->filter(fn($it) => !empty($it->leader_name)) ->groupBy('leader_name') ->map(fn($g) => $g->count()) ->sortDesc() ->take(1) ->map(fn($cnt, $name) => ['name'=>$name,'count'=>$cnt]) ->first(); @endphp
{{-- ✅ PROGRESS STEPPER / WIZARD --}}
Wizard
مراقبة المواعيد — خطوة بخطوة
0/4 مكتمل
ابدأ من لوحة المراقبة.
{{-- ✅ SLIDES --}}
{{-- ===================== SLIDE 1 ===================== --}}
شرح الخطوة 1
لوحة المراقبة + الإحصائيات السريعة
  • هنا تشوف وضع المواعيد بسرعة (إجمالي/نشطة/قادمة/متوسط المدة).
  • الترتيب: الأطول مدة أولًا، ثم الملغاة، ثم القادمة (0 دقيقة).
  • بعدها انتقل للفلاتر لو بدك تدقق على نوع/قائد/فترة زمنية.
{{-- HERO (ستايل سقراط) --}}

مراقبة مواعيد ProActive — الحالة والمدة

هنا تشوف كل مواعيد ProActive (عادي + بلس) مرتّبة من الأطول مدة إلى الأقل، مع حالة كل فعالية، وعدد التقارير المرتبطة بها ومن مين 💡.

{{-- كروت إحصائيات سريعة --}}
إجمالي المواعيد
{{ number_format($stats['total'] ?? 0) }}
نشطة الآن
{{ number_format($stats['active'] ?? 0) }}
قادمة
{{ number_format($stats['upcoming'] ?? 0) }}
متوسط مدة المنتهية
@php $avg = (int)($stats['avg_minutes'] ?? 0); if($avg >= 60){ $h = (int) round($avg / 60); echo $h.' س'; } else { echo $avg.' د'; } @endphp

* الترتيب كالتالي: أولاً الفعاليات اللي إلها مدة (نشطة/منتهية) من الأطول إلى الأقصر، ثم الملغاة، ثم القادمة (0 دقيقة).

{{-- ===================== SLIDE 2 ===================== --}}
شرح الخطوة 2
الفلاتر الذكية
  • حدّد النوع (عادي/بلس) أو الحالة (نشطة/قادمة/منتهية/ملغاة).
  • استخدم الفترة الزمنية لو بدك تقرير عن أسبوع/شهر محدد.
  • البحث يدعم (عنوان / قائد) عشان توصل بسرعة.
{{-- فلاتر (نفس المنطق GET — بس ستايل سقراط) --}}
Controls
فلاتر المراقبة
{{ $hasFilters ? 'يوجد فلاتر مفعّلة' : 'بدون فلاتر' }}
{{-- ✅ حتى بعد تطبيق الفلاتر يرجعك على النتائج --}}
@php $t = $filter['type'] ?? ''; @endphp
@php $st = $filter['status'] ?? ''; @endphp
تفريغ الفلاتر
{{-- ===================== SLIDE 3 ===================== --}}
شرح الخطوة 3
النتائج + التقارير المرتبطة
  • كل صف = موعد ProActive.
  • الحالة توضّح (نشطة/قادمة/منتهية/ملغاة).
  • “التقارير المرتبطة” يبين كم تقرير ومن مين.
@if($rows->count()) {{-- 💻 Desktop Table --}} {{-- 📱 Mobile Cards --}}
@foreach($rows as $item) @php $status = $item->status ?? 'upcoming'; $statusText = ['upcoming'=>'قادمة','active'=>'نشطة','finished'=>'منتهية','cancelled'=>'ملغاة'][$status] ?? $status; $statusClass = match($status){ 'active' => 'bg-cyan-500/15 text-cyan-200 border border-cyan-400/25', 'upcoming' => 'bg-emerald-500/15 text-emerald-200 border border-emerald-400/25', 'finished' => 'bg-slate-500/15 text-slate-200 border border-slate-400/25', 'cancelled' => 'bg-rose-500/15 text-rose-200 border border-rose-400/25', default => 'bg-slate-500/15 text-slate-200 border border-slate-400/25', }; $isPlus = ($item->event_type === 'plus'); $raw = $item->runtime_minutes ?? 0; $mins = (int) floor(max(0, $raw)); if ($mins === 0) { $durationText = '—'; } elseif ($mins >= 60) { $hours = (int) round($mins / 60); if ($hours === 1) $durationText = 'ساعة واحدة'; elseif ($hours === 2) $durationText = 'ساعتين'; elseif ($hours <= 10) $durationText = $hours.' ساعات'; else $durationText = $hours.' ساعة'; } else { $durationText = $mins.' دقيقة'; } $rep = $reportStats->get($item->id); $repCount = $rep->reports_count ?? 0; $repCreators= $rep->report_creators ?? ''; @endphp
{{ $item->event_date }} @if($item->event_time) {{ \Carbon\Carbon::parse($item->event_time)->format('H:i') }} @endif

{{ $item->event_title ?? 'موعد بدون عنوان' }}

@if($item->leader_name)
القائد: {{ $item->leader_name }}
@endif
{{ $statusText }}
{{ strtoupper($item->platform ?? '-') }} {{ $isPlus ? 'ProActive+ (بلس)' : 'ProActive عادي' }} {{ $durationText }}
{{-- تقارير --}}
@if($repCount > 0)
تم تسجيل {{ $repCount }} تقرير مرتبط بهذا الموعد.
@if($repCreators)
من: {{ $repCreators }}
@endif
@else
لا يوجد تقارير مرتبطة بهذا الموعد حتى الآن.
@endif
@endforeach @if($rows->hasPages())
{{ $rows->appends(request()->query())->links() }}
@endif
@else
لا توجد مواعيد ProActive لعرضها في هذه الصفحة حاليًا.
@endif
{{-- ===================== SLIDE 4 ===================== --}}
شرح الخطوة 4
قراءة سريعة + مفاتيح فهم الصفحة
  • هذه الخلاصة تساعدك تقرأ النتائج بسرعة بدون ما تغوص بكل صف.
  • مفيدة لملاحظة “تغطية التقارير” ولقطة عن أطول فعالية.
  • تقدر ترجع لأي سلايد من فوق من الـ Stepper.
Quick Insight
ملخص الصفحة الحالية
تغطية التقارير: {{ $coverage }}%
مواعيد في الصفحة
{{ $pageItems->count() }}
مواعيد معها تقارير
{{ $withReports }}
فلاتر مفعّلة؟
{{ $hasFilters ? 'نعم' : 'لا' }}
أطول فعالية (ضمن الصفحة)
@if($longestItem) @php $minsL = (int) floor(max(0, (float)($longestItem->runtime_minutes ?? 0))); $textL = $minsL > 0 ? ($minsL >= 60 ? ((int) round($minsL/60)).' ساعة تقريبًا' : $minsL.' دقيقة') : '—'; @endphp
{{ $longestItem->event_title ?? 'موعد بدون عنوان' }} — {{ $textL }}
{{ $longestItem->event_date ?? '—' }} @if(!empty($longestItem->leader_name)) · القائد: {{ $longestItem->leader_name }} @endif
@else
@endif
@if($topLeader)
أكثر قائد تكرارًا (ضمن الصفحة)
{{ $topLeader['name'] }} — {{ $topLeader['count'] }} موعد
@endif
Legend
مفاتيح فهم الحالات
نشطة Active
قادمة Upcoming
منتهية Finished
ملغاة Cancelled

ملاحظة

“المدة” تُحسب من runtime_minutes. الفعاليات القادمة غالبًا تظهر “—” لأن المدة = 0.

@push('scripts') @endpush @endsection