Developer Page Specifications
QC Checklist
Per-page acceptance gates. Severity-tagged test cases for listing, details, and cross-page integration.
مكتمل
شريط فحص QC ملموس لكلتا الصفحتَيْن. كل عنصر قابل للملاحظة من الخارج ويُؤكِّد حالة مُتوَقَّعة لكل §11 · test-case-format. الخطورة: blocker (يُوقف الإصدار) · critical (يجب-إصلاحه هذا sprint) · major (ينبغي-إصلاحه) · minor (تلميع).
شريط فحص صفحة القائمة
- OR-LIST-001 · blocker · الصفحة تُرجع 200 في EN + AR. كلا /en/opportunity-radar و /ar/opportunity-radar.
- OR-LIST-002 · blocker · كل tabs الحالة الـ 4 تُرسم بعَدَّادات محتسبة صحيحة تُطابق مجموعة البيانات النشطة.
- OR-LIST-003 · blocker · فلاتر country، type، stage، sector، status تَعمل مستقلّةً ومُجتَمعةً. multi-select يُضيف للاستعلام، إزالة chip تُزيل من الاستعلام.
- OR-LIST-004 · critical · البحث (q ≥ 2 حرف) يُؤجِّل 300ms ويُطابق عبر title، shortDescription، organizer، country، type، sector.
- OR-LIST-005 · critical · قيم منسدلة الفرز مُطَبَّقة صحيحاً: deadline-soonest يَفرز بـ DeadlineDate ASC، newest بـ PublishedAt DESC، إلخ.
- OR-LIST-006 · critical · الحالة الفارغة تَظهر حين (الفلاتر → 0 نتائج). الفلاتر النشطة مُقتبَسة، CTA "Clear filters" وظيفي.
- OR-LIST-007 · critical · كل كرت يَعرض كل الحقول المطلوبة (title، type، status، deadline، country، organizer، short description) بدون overflow.
- OR-LIST-008 · critical · CTA Apply يَفتح OfficialUrl في tab جديد مع noopener,noreferrer. حالة مُعطَّل حين OfficialUrl هو null.
- OR-LIST-009 · major · CTA View Opportunity يُوَجِّه لـ /:lang/opportunity-radar/{slug} وصفحة التفاصيل الصحيحة تَرسم.
- OR-LIST-010 · major · نموذج الاشتراك: التحقّق من البريد، بوّابة الموافقة المطلوبة، submit يُرسل POST لـ /api/subscriptions/opportunity-digest، toast نجاح يَرسم.
- OR-LIST-011 · major · كل الـ 4 كروت cross-module (G) تَرسم بعناوين + مسارات صحيحة.
- OR-LIST-012 · blocker · تَخطيط موبايل (320px / 375px / 640px): لا scroll أفقي، drawer الفلتر يَفتح صحيحاً، الكروت عمود واحد.
- OR-LIST-013 · blocker · RTL (/ar/*) — drawer الفلتر يَنزلق من اليسار، الكروت تَعكس صحيحاً، deadline pills تَعكس، chevrons تَعكس.
شريط فحص صفحة التفاصيل
- OR-DTL-001 · blocker · فرصة صحيحة تَتحمَّل بالـ slug. slug مجهول يُرجع 404 مع تَخطيط not-found موثَّق (ليس 500).
- OR-DTL-002 · blocker · Breadcrumb يَرسم Home → Opportunity Radar → العنوان الحالي. العنوان الحالي غير قابل للنقر.
- OR-DTL-003 · blocker · قسم header B يُظهر شارات الحالة، العنوان (الـ H1 الوحيد)، الوصف القصير، الموعد، الدولة، المرحلة(المراحل)، قيمة الإشارة.
- OR-DTL-004 · critical · صندوق Apply C: الزر يَفتح OfficialUrl في tab جديد. حالة مُعطَّل حين OfficialUrl null أو Status = Closed. ملاحظة last-verified تُظهر N أيام صحيحاً.
- OR-DTL-005 · critical · قسم Should-You-Apply D يُظهر urgency، best-for، الوقت المطلوب، قيمة الإشارة، متطلّبات التقديم، عدد الأهلية.
- OR-DTL-006 · critical · الأقسام E (وصف)، F (جمهور)، G (لماذا مهم)، H (فوائد)، I (أهلية)، J (متطلّبات التقديم)، K (timeline)، L (منظِّم) تَرسم فقط حين بياناتها الأساسية موجودة. لا أقسام فارغة.
- OR-DTL-007 · critical · Timeline (K) مفروز بـ date ASC. العناصر الماضية فاقدة-التشبّع.
- OR-DTL-008 · critical · Related Opportunities (M) — الروابط اليدوية أولاً، الملء التلقائي ثانياً، مَحدود بـ 6. القسم يَختفي تماماً حين كلاهما يُرجع 0.
- OR-DTL-009 · critical · Connected Signals (N) — مَحدود بـ 8 كروت. رابط "See all" يَظهر حين يوجد أكثر. كل كرت يُوَجِّه صحيحاً لكل sourceRoute.
- OR-DTL-010 · major · كتلة الاشتراك O تَختار مُسبَقاً اهتمام Opportunity Radar + تَتتبَّع opportunityIdContext.
- OR-DTL-011 · critical · الفرص المُغلقة: زر Apply مُعطَّل، banner "This opportunity is closed" فوق صندوق apply، JSON-LD eventStatus يَعكس الحالة المُغلقة عند الهجرة.
- OR-DTL-012 · blocker · SEO/AEO: canonical، hreflang ثلاثي، OG رباعي، tag robots، CreativeWork JSON-LD يَتحقّق مقابل Rich Results Test.
- OR-DTL-013 · blocker · تَخطيط موبايل: CTAs عرض-كامل مُكدَّسة، الشريط الجانبي يَنتقل تحت الرئيسي، لا scroll أفقي، زر Apply ثابت في الأسفل على Status ≠ Closed.
- OR-DTL-014 · blocker · RTL (/ar/*) — timeline يَعكس (عمود التاريخ يَنتقل لليمين)، الشريط الجانبي يَنتقل لليسار، كل chevrons تَعكس، status pills تَعكس.
فحوصات Cross-page / تكامل
- OR-INT-001 · blocker · مَسْح السلامة (§10.8) يُبَلِّغ عن 0 مراجع cross-module مكسورة تَشمل أيّ صف Opportunity.
- OR-INT-002 · critical · Sitemap.xml يَحتوي على كل URL فرصة IsActive=true في كلتا المحلّيتَيْن.
- OR-INT-003 · critical · كل الـ 9 أحداث صفحة-القائمة + 6 صفحة-التفاصيل تُطلق بخصائص صحيحة (مُتحقَّق منها عبر GA4 DebugView أثناء QC الإصدار).
- OR-INT-004 · major · Headers الـ cache محترمة في CDN: summary cache 60s، listing cache 120s، details cache 300s.
- OR-INT-005 · major · الأداء: Listing LCP ≤ 2.5s على 3G Fast، details LCP ≤ 2.0s، CLS ≤ 0.1 على كليهما، عدم-تطابق hydration = 0.
