قوالب الهستوباثولوجي — أقسام ديناميكية قابلة للتخصيص

تحليل الوضع الحالي + التصميم المقترح — قبل البدء في التنفيذ

التاريخ: 3 يونيو 2026  •  الموديول: LIS  •  BE: lab_histopath_templates · lab_histopath_results · FE: histopath-templates · result-histopath-cell

1) الطلب (اللي فهمته)

2) الوضع الحالي (موجود بالفعل)

النظام فيه بنية هستوباثولوجي كاملة شغّالة — بس بأقسام ثابتة مفرّغة في الكود.

المكوّنالموجودالحالة
جدول القالب lab_histopath_templates4 أعمدة نص ثابتة: gross_template · microscopic_template · diagnosis_template · recommendation_template + name / subspecialtyثابت
جدول النتيجة lab_histopath_resultsأعمدة ثابتة: gross/microscopic/diagnosis/comment/recommendation + حقول مهيكلة (icd, tnm, margin, ihc) + custom_fields JSON بشكل [{label,value}]ثابت + custom محدود
محرّر القالب (FE) histopath-templatesتابات مفرّغة في الـHTML: Basic · Gross · Micro · Dx · Rec — كل تاب formControlName ثابتثابت
إدخال النتيجة (FE) result-histopath-cellتابات ثابتة: Gross · Microscopic · Diagnosis · IHC/Staging · Images · Auditثابت
قوالب جاهزة (Seeder)16 قالب تخصّصي (Breast, …) فيهم نص جاهز بـplaceholders {size}موجود

الفجوة

الأقسام (Gross / Micro / Dx / Rec) مفروضة في الكود — مش ممكن تضيف قسم جديد، ولا تشيل واحد، ولا تغيّر عنوانه. الـcustom_fields الحالي مجرد قائمة label/value مسطّحة، مش أقسام بعناوين ونصوص كاملة.

3) التصميم المقترح — أقسام مدفوعة بالبيانات

نحوّل القالب من 4 أعمدة ثابتة إلى مصفوفة أقسام JSON يتحكم فيها المستخدم بالكامل.

شكل الـsections في القالب

// lab_histopath_templates.sections (JSON جديد) [ { "key": "gross", "title": "Gross Description", "title_ar": "الوصف العياني", "body": "…نص جاهز…", "sort": 1 }, { "key": "micro", "title": "Microscopic", "title_ar": "الفحص المجهري", "body": "…", "sort": 2 }, { "key": "custom_1", "title": "Special Stains", "title_ar": "الصبغات الخاصة", "body": "…", "sort": 3 } ]

النتيجة بتخزّن القيم المعبّأة في JSON موازي مفتاحه key القسم — فأي قسم يتشال/يتضاف من القالب بيظهر/يختفي في الإدخال تلقائياً.

شكل الشاشتين بعد التعديل

محرّر القالب (ديناميكي)
العياني المجهري التشخيص + إضافة قسم
العنوان: الوصف العياني   |   ↕ ترتيب   |   🗑 حذف
نص القسم (textarea / محرّر) — placeholders {size} مدعومة…
إدخال النتيجة (ديناميكي)
العياني المجهري التشخيص 🧪 IHC/صور (نظام)
نص النتيجة للقسم — يبدأ من نص القالب ويتعدّل…

4) نقاط محتاج قرارك فيها قبل التنفيذ

أ) التابات المهيكلة (IHC / TNM / Margins / Images / Audit): دي حالياً حقول مهيكلة مش مجرد نص. تفضّل:
  • (1) تبقى تابات نظام ثابتة جنب الأقسام الديناميكية (الأقسام النصية بس هي القابلة للتخصيص) — الأبسط والأأمن.
  • (2) أو تبقى كمان قابلة للإخفاء/الحذف.
ب) نوع محرّر النص للقسم: textarea عادي (زي الحالي) — ولا محرّر Rich Text (Bold / قوائم / جداول) للتقارير الباثولوجية؟
ج) نطاق التخصيص: الأقسام تتعرّف لكل قالب (كل subspecialty له أقسامه) — صح كده؟ ولا عايز قائمة أقسام افتراضية على مستوى المعمل كلها؟
د) البيانات القديمة: الـ16 قالب الموجودين + أي نتائج قديمة — نعمل migration يحوّل الأعمدة الـ4 الثابتة لأقسام افتراضية (Gross/Micro/Dx/Rec) تلقائياً عشان مايضيعش حاجة، وبعدها تخصّص براحتك. (موافق؟)

5) خطة التنفيذ المقترحة (Backend-first)

المرحلة 1 — Backend

  • Migration: sections JSON على lab_histopath_templates + sections JSON على lab_histopath_results (قيم معبّأة مفتاحها key).
  • Back-fill: تحويل الأعمدة الـ4 الحالية لأقسام افتراضية في sections (idempotent).
  • تعديل LabHistopathTemplateController + الـRequests لقبول/التحقق من مصفوفة الأقسام.
  • تعديل حفظ النتيجة (LabHistopathResult) لتخزين/قراءة القيم الديناميكية + إبقاء الأعمدة القديمة متزامنة للتوافق مع التقرير المطبوع.
  • bash local-deploy.sh + اختبار curl.

المرحلة 2 — Frontend

  • محرّر القالب: قائمة تابات ديناميكية (إضافة / إعادة تسمية / حذف / ترتيب بالسحب) + حقل عنوان + محرّر نص لكل قسم.
  • إدخال النتيجة: توليد التابات من أقسام القالب المختار (بدل الثابتة) — مع إبقاء تابات النظام (IHC/Images/Audit) حسب قرار النقطة (أ).
  • تحديث الموديلات والـservices + الترجمات.
  • التقرير المطبوع (PDF) يعرض الأقسام الديناميكية بالترتيب.

المرحلة 3 — تحقق

  • قالب جديد بأقسام مخصّصة → إدخال نتيجة → طباعة → التأكد إن الأقسام بتظهر صح.
  • قالب قديم (بعد back-fill) يفضل شغّال زي ما هو.

6) الخلاصة