@extends('layouts.superadmin')
@section('title','مشاكل وحلول — غرفة إيمان الملكاوي')
@section('content')
@php
use Illuminate\Support\Str;
$members = collect($members ?? [])->map(fn($m) => is_array($m) ? (object)$m : $m);
$membersMap = $members->keyBy('id');
$decode = function ($json) {
if (!$json) return [];
$arr = json_decode($json, true);
return is_array($arr) ? $arr : [];
};
$safeAvatar = function ($avatar) {
if (!$avatar) return null;
if (Str::startsWith($avatar, ['http://','https://','//'])) return $avatar;
if (Str::startsWith($avatar, ['storage/','/storage/'])) return Str::startsWith($avatar,'/') ? $avatar : '/'.$avatar;
if (Str::startsWith($avatar, ['public/'])) return '/storage/'.Str::after($avatar,'public/');
if (Str::contains($avatar,'/')) return '/'.$avatar;
return null;
};
$severityMeta = [
'low' => ['t'=>'منخفضة','cls'=>'border-emerald-400/20 bg-emerald-500/10 text-emerald-200','ic'=>'fa-leaf'],
'medium' => ['t'=>'متوسطة','cls'=>'border-sky-400/20 bg-sky-500/10 text-sky-200','ic'=>'fa-wave-square'],
'high' => ['t'=>'عالية','cls'=>'border-amber-400/20 bg-amber-500/10 text-amber-100','ic'=>'fa-triangle-exclamation'],
'critical' => ['t'=>'حرجة','cls'=>'border-rose-400/20 bg-rose-500/10 text-rose-100','ic'=>'fa-skull-crossbones'],
];
$statusMeta = [
'open' => ['t'=>'مفتوحة','cls'=>'border-white/10 bg-white/5 text-white/80','ic'=>'fa-circle-dot'],
'in_progress' => ['t'=>'قيد العمل','cls'=>'border-cyan-400/20 bg-cyan-500/10 text-cyan-200','ic'=>'fa-spinner'],
'resolved' => ['t'=>'تم الحل','cls'=>'border-emerald-400/20 bg-emerald-500/10 text-emerald-200','ic'=>'fa-circle-check'],
'blocked' => ['t'=>'معلّقة','cls'=>'border-amber-400/20 bg-amber-500/10 text-amber-100','ic'=>'fa-ban'],
];
$fmtSize = function ($bytes) {
$b = (float)($bytes ?? 0);
if ($b <= 0) return null;
$units = ['B','KB','MB','GB'];
$i=0; while ($b>=1024 && $i<3) { $b/=1024; $i++; }
return number_format($b,2).$units[$i];
};
@endphp
{{-- HERO --}}
مشاكل + حلول + سجلات توثيق
سجّل المشكلة، وضّح الحل، وراقب التقدم بسجل واضح — والضغط على أي عنصر يفتح تفاصيله في Drawer.
الفترة: {{ $from }} → {{ $to }}
{{-- FLASH --}}
@if(session('success'))
{{ session('success') }}
@endif
@if($errors->any())
في أخطاء:
@foreach($errors->all() as $e)
- {{ $e }}
@endforeach
@endif
{{-- STATS --}}
{{-- LIST --}}
@if($viewMode === 'cards')
@forelse($issues as $i)
@php
$sev = $i->severity ?? 'medium';
$st = $i->status ?? 'open';
$sevM = $severityMeta[$sev] ?? $severityMeta['medium'];
$stM = $statusMeta[$st] ?? $statusMeta['open'];
$memberIds = $decode($i->member_ids ?? null);
$att = $decode($i->attachments ?? null);
$dur = $i->duration_minutes ? round(($i->duration_minutes/60),2).' ساعة' : '—';
$issueAt = $i->issue_at ?? ($i->created_at ?? null);
$pFrom = $i->period_from ?? '—';
$pTo = $i->period_to ?? '—';
@endphp
@empty
لا يوجد عناصر بعد.
@endforelse
@else
| العنوان |
الوقت |
الخطورة |
الحالة |
الفترة |
المدة |
متابعة |
مرفقات |
@forelse($issues as $i)
@php
$sev = $i->severity ?? 'medium';
$st = $i->status ?? 'open';
$sevM = $severityMeta[$sev] ?? $severityMeta['medium'];
$stM = $statusMeta[$st] ?? $statusMeta['open'];
$att = $decode($i->attachments ?? null);
$dur = $i->duration_minutes ? round(($i->duration_minutes/60),2).'س' : '—';
$issueAt = $i->issue_at ?? ($i->created_at ?? null);
$pFrom = $i->period_from ?? '—';
$pTo = $i->period_to ?? '—';
@endphp
| {{ $i->issue_title }} |
{{ $issueAt ?? '—' }} |
{{ $sevM['t'] }}
|
{{ $stM['t'] }}
|
{{ $pFrom }} → {{ $pTo }} |
{{ $dur }} |
{{ ($i->has_followup ?? 0) == 1 ? 'نعم' : 'لا' }} |
{{ is_array($att) ? count($att) : 0 }} |
{{-- Template للتفاصيل --}}
@php
$memberIds = $decode($i->member_ids ?? null);
@endphp
تفاصيل المشكلة
{{ $issueAt ?? '—' }}
{{ $sevM['t'] }}
{{ $stM['t'] }}
الفترة: {{ $pFrom }} → {{ $pTo }}
•
المدة: {{ $dur }}
@if($i->issue_text)
وصف المشكلة
{{ $i->issue_text }}
@endif
@if($i->solution_text)
الحل / المعالجة
{{ $i->solution_text }}
@endif
@if(($i->has_followup ?? 0) == 1 && $i->followup_text)
المتابعات
{{ $i->followup_text }}
@endif
@if(is_array($memberIds) && count($memberIds))
الأعضاء المرتبطين
@foreach($memberIds as $mid)
@php
$m = $membersMap->get((int)$mid);
$mName = $m?->name ?? ('#'.$mid);
$mAv = $safeAvatar($m?->avatar ?? null);
@endphp
@if($mAv)

@else
@endif
{{ $mName }}
@endforeach
@endif
@if(is_array($att) && count($att))
المرفقات
@foreach($att as $a)
@php
$p = $a['path'] ?? null;
$name = $a['name'] ?? 'file';
$mime = $a['mime'] ?? null;
$size = $fmtSize($a['size'] ?? null);
$url = $p ? (Str::startsWith($p,'public/') ? Storage::url($p) : (Str::startsWith($p,'/storage') ? $p : $p)) : null;
$isImg = $mime ? Str::startsWith($mime,'image/') : Str::endsWith(strtolower($name), ['.png','.jpg','.jpeg','.webp','.gif']);
@endphp
{{ $mime ?? 'file' }} @if($size) • {{ $size }} @endif
@if($url)
فتح
@endif
@if($url && $isImg)
@endif
@endforeach
@endif
@empty
| لا يوجد عناصر بعد. |
@endforelse
@endif
{{-- LOGS TABLE --}}
| الوقت |
الإجراء |
Issue ID |
Actor |
IP |
@forelse($logs as $l)
| {{ $l->created_at ?? '—' }} |
{{ $l->action ?? '—' }} |
{{ $l->issue_id ?? '—' }} |
{{ $l->actor_id ?? '—' }} |
{{ $l->ip ?? '—' }} |
@empty
| لا يوجد سجلات. |
@endforelse
{{-- DRAWER: DETAILS --}}
Drawer تفاصيل
اضغط على أي عنصر من القائمة لعرض التفاصيل هنا
اختر عنصرًا لعرض تفاصيله.
{{-- MODAL: CREATE --}}
إنشاء مشكلة/حل
مودل سكرول — مناسب للهاتف — JS Scoped
@endsection