249 lines
6.5 KiB
Plaintext
249 lines
6.5 KiB
Plaintext
أريد بناء نظام تنبيهات كامل داخل الاجتماعات الاجتماعات:
|
|
|
|
|
|
عرض تنبيه قبل الاجتماع القادم بـ 5 دقائق بطريقة واضحة وبسيطة ومناسبة
|
|
|
|
========================================
|
|
🧠 منطق النظام (Logic)
|
|
========================================
|
|
|
|
1. جلب اجتماعات اليوم فقط.
|
|
2. استبعاد الاجتماعات:
|
|
- status = cancelled
|
|
- status = completed
|
|
3. ترتيب الاجتماعات حسب startTime تصاعديًا.
|
|
4. تحديد الاجتماع القادم (أقرب اجتماع لم يبدأ بعد).
|
|
5. حساب الفرق بين الوقت الحالي ووقت بداية الاجتماع.
|
|
|
|
إذا:
|
|
remainingTime <= 5 دقائق AND remainingTime > 0
|
|
|
|
→ يظهر التنبيه.
|
|
|
|
========================================
|
|
🚫 شروط عدم الظهور
|
|
========================================
|
|
|
|
- إذا تم الضغط على "تم"
|
|
- إذا تم الضغط على "حذف التنبيه"
|
|
- إذا تم إلغاء الاجتماع
|
|
- إذا انتهى الاجتماع
|
|
-
|
|
|
|
========================================
|
|
🖥️ واجهة التنبيه (UI)
|
|
========================================
|
|
|
|
يظهر كـ:
|
|
Modal أو Toast في أعلى/وسط الشاشة يستطيع المستخدم تحريكه على اي اتجاه.
|
|
|
|
وكذالك التنبيه يظهر حتى لو انه خارج تطبيق الاجتماعات يظهر
|
|
|
|
يحتوي على:
|
|
|
|
- عنوان:
|
|
باقي على الاجتماع القادم 5 دقائق
|
|
|
|
- اسم الاجتماع
|
|
|
|
- الوقت:
|
|
مثال:
|
|
10:00
|
|
10:30
|
|
|
|
|
|
- تصميم:
|
|
- رسمي
|
|
- بسيط
|
|
- مناسب لجميع الاجهزه
|
|
- RTL
|
|
|
|
========================================
|
|
🔘 الأزرار داخل التنبيه
|
|
========================================
|
|
|
|
1) زر: تم
|
|
- إخفاء التنبيه
|
|
- لا تعديل على الاجتماع
|
|
- تسجيل في Audit Log:
|
|
meeting_alert_acknowledged
|
|
|
|
----------------------------------------
|
|
|
|
2) زر: تأجيل
|
|
عند الضغط:
|
|
يفتح Modal يحتوي 3 أقسام:
|
|
|
|
----------------------------------------
|
|
🔹 القسم الأول: تأجيل بالدقائق
|
|
----------------------------------------
|
|
|
|
خيارات:
|
|
- 5 دقائق
|
|
- 10 دقائق
|
|
- 15 دقيقة
|
|
- 30 دقيقة
|
|
- 45 دقيقة
|
|
- 60 دقيقة
|
|
|
|
عند اختيار مدة:
|
|
- تعديل startTime و endTime مباشرة
|
|
- مثال:
|
|
10:00 - 10:30 → 10:15 - 10:45
|
|
- إغلاق التنبيه
|
|
- إعادة ترتيب جدول اليوم حسب الوقت
|
|
- إعادة ترقيم عمود "#"
|
|
- تسجيل:
|
|
meeting_postponed_minutes
|
|
|
|
----------------------------------------
|
|
🔹 القسم الثاني: تأجيل إلى وقت لاحق
|
|
----------------------------------------
|
|
|
|
نموذج يحتوي:
|
|
- التاريخ
|
|
- وقت البداية
|
|
- وقت النهاية
|
|
- ملاحظة (اختياري)
|
|
|
|
عند الحفظ:
|
|
- تحديث الاجتماع مباشرة
|
|
- إذا نفس اليوم:
|
|
→ إعادة ترتيب الجدول
|
|
- إذا يوم آخر:
|
|
→ إزالته من جدول اليوم
|
|
- إعادة ترقيم "م"
|
|
- تسجيل:
|
|
meeting_rescheduled
|
|
|
|
----------------------------------------
|
|
🔹 القسم الثالث: إلغاء الاجتماع
|
|
----------------------------------------
|
|
|
|
عند الضغط:
|
|
يظهر Confirmation:
|
|
|
|
"هل أنت متأكد من إلغاء هذا الاجتماع من جدول اليوم؟"
|
|
|
|
الأزرار:
|
|
- نعم، إلغاء الاجتماع
|
|
- تراجع
|
|
|
|
عند التأكيد:
|
|
- status = cancelled
|
|
- لا حذف من قاعدة البيانات
|
|
- إخفاء من جدول اليوم
|
|
- إعادة ترتيب الجدول
|
|
- إعادة ترقيم "#"
|
|
- تسجيل:
|
|
meeting_cancelled
|
|
|
|
----------------------------------------
|
|
|
|
3) زر: حذف التنبيه
|
|
- إخفاء التنبيه فقط
|
|
- لا تعديل على الاجتماع
|
|
- تسجيل:
|
|
meeting_alert_dismissed
|
|
|
|
========================================
|
|
⚙️ إعادة ترتيب الجدول (Auto Reordering)
|
|
========================================
|
|
|
|
بعد أي عملية:
|
|
- تأجيل
|
|
- إعادة جدولة
|
|
- إلغاء
|
|
|
|
يجب:
|
|
- sort by startTime ASC
|
|
- إعادة ترقيم عمود "#"
|
|
- تحديث العرض مباشرة بدون Refresh كامل
|
|
|
|
========================================
|
|
⚠️ التعارضات (Conflict)
|
|
========================================
|
|
|
|
إذا أصبح هناك تداخل في الأوقات:
|
|
- لا تمنع العملية
|
|
- اعرض رسالة بسيطة:
|
|
"يوجد تعارض محتمل في وقت الاجتماعات"
|
|
|
|
========================================
|
|
🗄️ قاعدة البيانات (اختياري إذا غير موجود)
|
|
========================================
|
|
|
|
جدول:
|
|
executive_meeting_alert_state
|
|
|
|
حقول:
|
|
- id
|
|
- meetingId
|
|
- userId
|
|
- dismissed (boolean)
|
|
- acknowledged (boolean)
|
|
- updatedAt
|
|
|
|
========================================
|
|
📜 Audit Log
|
|
========================================
|
|
|
|
سجل العمليات:
|
|
|
|
- meeting_alert_shown
|
|
- meeting_alert_acknowledged
|
|
- meeting_alert_dismissed
|
|
- meeting_postponed_minutes
|
|
- meeting_rescheduled
|
|
- meeting_cancelled
|
|
|
|
========================================
|
|
🧩 Frontend
|
|
========================================
|
|
|
|
Component جديد:
|
|
UpcomingMeetingAlert
|
|
|
|
يرتبط بـ:
|
|
- صفحة جدول الاجتماعات اليومية
|
|
|
|
يعمل:
|
|
- polling أو timer كل 30 ثانية
|
|
- حساب الاجتماع القادم
|
|
- إظهار التنبيه عند الحاجة
|
|
|
|
========================================
|
|
🧪 الاختبار
|
|
========================================
|
|
|
|
1. أضف اجتماع بعد 5 دقائق
|
|
→ يجب أن يظهر التنبيه
|
|
|
|
2. اضغط "تم"
|
|
→ يختفي
|
|
|
|
3. اضغط "تأجيل 10 دقائق"
|
|
→ يتغير الوقت + يعاد ترتيب الجدول
|
|
|
|
4. اضغط "تأجيل إلى وقت لاحق"
|
|
→ يتحدث الاجتماع
|
|
|
|
5. اضغط "إلغاء"
|
|
→ يختفي من الجدول
|
|
|
|
6. تأكد:
|
|
|
|
- كل شيء مباشر
|
|
|
|
========================================
|
|
🚫 قيود مهمة
|
|
========================================
|
|
|
|
- لا تغيّر النظام العام
|
|
- لا تضف Workflow
|
|
- لا تضف Roles جديدة
|
|
- التعديل فقط داخل Executive Meetings
|
|
- الحفاظ على التصميم الرسمي والبسيط
|
|
|
|
|