Control Panel Specifications
List
Admin listing. Filters (status, category, sponsor, language readiness, date range). Per-row + bulk actions. Permission-aware row controls.
مكتمل
القائمة الإدارية هي نقطة دخول كل Founder File بغضّ النظر عن الحالة. هي جدول مدفوع من السيرفر بـ بحث نصّي كامل، لوحة فلاتر متعدّدة، ترتيب، تقسيم لصفحات، قائمة إجراءات لكل صفّ، وإجراءات جماعية بالاختيار المتعدّد. Form preview أسفل الصفحة يعرض لوحة الفلاتر كما يراها الأدمن.
صندوق البحث
- الغرض — بحث نصّي حرّ عبر الحقول العرضية للملف. أسرع طريقة لإيجاد ملف محدّد لمّا الأدمن يعرف اسمه أو موضوعه.
- نوع DB — فهرس نصّي كامل على `FounderFileLang.Title`، `FounderFileLang.Subtitle`، `FounderFileLang.FullDescription`، `FounderFile.Slug`. الاستعلام: `CONTAINS((Title, Subtitle, FullDescription, Slug), @term)` عبر صفوف اللغات الثلاثة المرتبطة بالملف. الحد الأدنى 2 حرف قبل البدء؛ debounce 250 ms على العميل.
- التحقّق — اختبارات QC: ابحث "fund" → يطابق الملفات اللي فيها `funding` في العنوان عبر EN/AR/FR؛ ابحث `تمويل` → يطابق العناوين AR؛ ابحث الـ slug الكامل → يطابق صفّ واحد؛ ابحث حرف واحد → ما يُطلق طلب.
الفلاتر (على السيرفر، تجتمع بـ AND)
الحالة
- الغرض — تقسيم القائمة حسب مرحلة الحياة. أكثر فلتر يُستخدم — المراجِعون يعيشون على `under-review`، المحرّرون على `draft + needs-updates`.
- نوع DB — اختيار متعدّد. الاستعلام: `WHERE Status IN (@statuses)`. القيمة الافتراضية = ALL ناقص `archived` (archived مخفي افتراضياً عشان القائمة تركّز على العمل الحيّ).
- التحقّق — اختبارات QC: افتح القائمة جديدة → الملفات المؤرشفة لا تظهر؛ علِّم `under-review` فقط → فقط هذه الملفات تظهر؛ علِّم `archived` صراحةً → الملفات المؤرشفة تظهر بستايل رمادي خفيف.
الفئة
- الغرض — فلتر فئة باختيار واحد. يعيد استخدام تصنيف Category المشترك مع Articles — اختيار Funding هنا يطابق أي ملف الـ CategoryId بتاعه يحلّ لـ slug `funding`.
- نوع DB — `WHERE CategoryId = @categoryId` (مع join لـ Category لعرض الـ label).
- التحقّق — اختبارات QC: اختر فئة → عدد الصفوف يطابق استعلام SQL مباشر بنفس الـ `WHERE`؛ تأكّد إن خيارات الـ dropdown تطابق خيارات Category في Articles بالظبط (تصنيف مشترك).
الراعي
- الغرض — إيجاد كل الملفات المرتبطة براعي محدّد — يستخدمه فريق business التحريري أثناء تجديد العقود.
- نوع DB — اختيار واحد مع type-ahead. الخيارات: `None` (SponsorId IS NULL) + كل صفّ نشط في `FounderFileSponsor`. الاستعلام: `WHERE SponsorId = @sponsorId` أو `WHERE SponsorId IS NULL`.
- التحقّق — اختبارات QC: اكتب "Bank" → الـ dropdown يفلتر حيّاً؛ اختر "None" → فقط الملفات اللي SponsorId NULL تظهر.
جاهزية اللغات
- الغرض — إيجاد الملفات اللي ناقصها صفّ لغة أو أكثر. Editorial Lead يستخدمه لتعليم الملفات اللي ما كانش لازم تخرج من draft.
- نوع DB — predicate مُشتقّ على عدد `FounderFileLang` لكل FileId. الخيارات: `All-3-ready` (3 صفوف)، `2-of-3`، `EN-only`، `AR-only`، `FR-only`، `Incomplete` (أي صفّ ناقص حقول إلزامية).
- التحقّق — اختبارات QC: اختر `EN-only` → الملفات اللي عندها صفوف FounderFileLang فقط لـ `en` تظهر؛ اختر `All-3-ready` → كل الملفات الراجعة عندها 3 صفوف بالظبط + كل صفّ يجتاز البوّابة الثلاثية.
نطاق التاريخ
- الغرض — تقييد القائمة زمنياً لتقارير "ما الذي تغيّر هذا الأسبوع / الشهر / الربع".
- نوع DB — الأدمن يختار عمود التاريخ (CreatedAt / PublishedAt / LastUpdatedAt) + تاريخ البداية + النهاية. الاستعلام: `WHERE {chosenColumn} BETWEEN @start AND @end`.
- التحقّق — نطاقات مُعدّة: آخر 7 / 30 / 90 يوم. اختبارات QC: اختر "آخر 7 أيام على PublishedAt" → فقط الملفات اللي PublishedAt بتاعها خلال آخر 7 أيام تظهر.
الأعمدة الظاهرة + الإجراءات لكل صفّ
- صورة مصغّرة للغلاف (3:4) · العنوان (مع لاحقة `(N langs)`) · شارة الفئة · شارة الحالة · اسم الراعي · آخر تحديث (نسبي) · عدد العملاء · قائمة kebab.
- إجراءات kebab: Edit · View public page (معطّل لو غير منشور) · Preview as founder · View leads · Submit for review (فقط draft / needs-updates مع 3 لغات) · Archive (معطّل لو في عملاء معلّقين) · Restore (فقط للمؤرشف خلال 90 يوم).
إجراءات جماعية (الاختيار ≥ 2)
- Submit for review · Archive · إعادة تعيين راعي (نفس الـ tier فقط) · Export metadata CSV.
- اختبار QC: اختر 5 ملفات منهم 3 جاهزين 3-لغات، اضغط Submit الجماعي → 3 تنجح، 2 يفشلوا بـ toasts خطأ تسمّي اللغة(ات) الناقصة لكل ملف.
معاينة الفورم — لوحة الفلاتر
لوحة الفلاتر تظهر كسكّة يسار على القائمة. البحث في أعلى الجدول، الترتيب dropdown في الـ header.
