تخطَّ إلى المحتوى الرئيسي

Developer Page Specifications

QC Checklist

Per-route gates. Date chip never collapses. Timezone fixed-clock regression. Status persistence drift = critical.

مكتمل

QC لكل مسار. الخطورة لكل §11.1.

صفحة الهبوط

  • MSC-LAND-001 · blocker · /en/calendar + /ar/calendar تُرجع 200.
  • MSC-LAND-002 · blocker · شريط This-week يَرسم فعاليات بـ startDate ضمن ±7 أيام. حالة فارغة حين 0 فعاليات.
  • MSC-LAND-003 · blocker · شريط Closing-soon يَرسم فعاليات حيث الحالة المحتسبة = closing-soon. شرائح موعد warning-tinted.
  • MSC-LAND-004 · critical · 16 بلاطة دولة تَرسم بأعداد فعاليات حيّة صحيحة.
  • MSC-LAND-005 · critical · 17 بلاطة فئة تَرسم بأعداد صحيحة.
  • MSC-LAND-006 · major · Spotlight يَرسم فقط حين ≥1 فعالية لها editorialPriority=spotlight.

صفحات القائمة (8 متغيّرات scope)

  • MSC-LIST-001 · blocker · كل المسارات الـ 8 للقائمة تُرجع 200 (events، countries/{x16}، categories/{x17}، audiences/{x9}، stages/{x7}، this-week، closing-soon).
  • MSC-LIST-002 · blocker · شريط الفلتر (country، category، audience، stage، status، mode) يُحَدِّث URL queryParams ويُعيد الجلب.
  • MSC-LIST-003 · critical · chip التاريخ على الكروت لا يَنطوي تحت 320px viewport. الكرت يَنقلب لتَخطيط أفقي على الموبايل.
  • MSC-LIST-004 · critical · صبغات شارة الحالة تُطابق الحالة المحتسبة.
  • MSC-LIST-005 · blocker · تكافؤ موبايل / RTL.

صفحة التفاصيل

  • MSC-DTL-001 · blocker · /en/calendar/events/{slug} + AR تُرجع 200 لكل فعالية IsActive. slug مجهول → 404.
  • MSC-DTL-002 · blocker · حساب الحالة يَستخدم event.Timezone، ليس ساعة الزائر. انحدار ساعة-ثابتة يُؤكِّد.
  • MSC-DTL-003 · critical · CTA Register/Apply يَفتح URL الصحيح في tab جديد. ترقية closing-soon ("Apply (closing soon)") حين applicationDeadline ضمن 7 أيام.
  • MSC-DTL-004 · critical · Add-to-calendar يُوَلِّد .ics صالح يَستورد في Google Calendar + Apple Calendar بدون تحذيرات.
  • MSC-DTL-005 · critical · banner Postponed / Cancelled يَرسم صحيحاً. Cancelled يُعطِّل كل CTAs.
  • MSC-DTL-006 · critical · شريط cross-module الجانبي يَرسم 5 أنواع علاقات (founders، startups، editorial، opportunities، files). الـ IDs البالية تُجَرَّد عند الرسم.
  • MSC-DTL-007 · critical · قسم Coverage يَرسم كل CoverageArticle بـ parentEventId = this.id، مفروز بـ publishedAt DESC.
  • MSC-DTL-008 · blocker · JSON-LD يَتحقّق مقابل Google Rich Results Test لـ Event subtype يُطابق Event.Category.
  • MSC-DTL-009 · blocker · تكافؤ موبايل / RTL.

تدفّق التقديم

  • MSC-SUB-001 · blocker · النموذج يَتحقّق من الحقول المطلوبة + title bilingual + على الأقل URL خارجي + endDate >= startDate.
  • MSC-SUB-002 · critical · Submit يُرسل POST لـ /api/calendar/events/submissions، يُرجع 201، المُقدِّم يَستلم بريد تأكيد.
  • MSC-SUB-003 · critical · حد المعدّل: 3/IP/يوم مُنَفَّذ. CAPTCHA بعد التقديم الـ 2.
  • MSC-SUB-004 · critical · الفعاليات المُقدَّمة-حديثاً افتراضي verificationStatus=pending ولا تَظهر على القوائم العامة حتى admin يَتحقّق.

التكامل

  • MSC-INT-001 · critical · كل CalendarEvent.RelatedXxxId يُحَلَّ لصف نشط في الموديول المُسْتَهدَف. مَسْح السلامة (§10.8) يُبَلِّغ عن 0 مكسور.
  • MSC-INT-002 · critical · مَهمّة إعادة-التحقّق تُعلِّم تلقائياً الفعاليات الأقدم من 30 يوم منذ lastVerified أو ضمن 14 يوم من startDate.
  • MSC-INT-003 · critical · مَهمّة حفظ الحالة (ليلية) تُعيد حساب Status لكل فعالية IsActive. الانحراف = عَيب حرج.
  • MSC-INT-004 · major · Sitemap.xml يَشمل كل URL فعالية IsActive في كلتا المحلّيتَيْن.