Task #714: rooms management submenu + rooms dashboard

- protocol.tsx: added collapsible "إدارة القاعات" nav group (giftsGroup pattern)
  containing لوحة القاعات (roomsDashboard, new), القاعات (rooms),
  حجز القاعات (bookings), إعدادات الحجوزات (bookingSettings, canManageRooms only).
- Deep-link slugs: /protocol/rooms-dashboard, /protocol/booking-settings.
- SlotsAdminSection moved from rooms tab to booking-settings tab; non-manager
  deep-link shows no-access empty state.
- New RoomsDashboardView (recharts): KPI cards, next-booking countdown,
  14/30-day area chart, by-room bar chart, by-status pie.
- API: new GET /api/protocol/rooms-stats (requireProtocolAccess), Riyadh-tz
  day boundaries, 30-day zero-filled daily series, byRoom/byStatus, nextBooking.
- i18n keys ar/en (tabs + protocol.roomsDash.* with Arabic plurals).
- Tests: artifacts/api-server/tests/protocol-rooms-stats.test.mjs (2 pass).
- Architect review passed; typechecks clean (pre-existing errors in
  executive-meetings.ts/push.ts untouched).
This commit is contained in:
Replit Agent
2026-07-08 20:39:29 +00:00
parent 81dd7b708f
commit 89331004f3
5 changed files with 917 additions and 7 deletions
+35
View File
@@ -1667,6 +1667,9 @@
"confirmDelete": "لا يمكن التراجع عن هذا الإجراء.",
"tabs": {
"dashboard": "لوحة المعلومات",
"roomsGroup": "إدارة القاعات",
"roomsDashboard": "لوحة القاعات",
"bookingSettings": "إعدادات الحجوزات",
"bookings": "حجز القاعات",
"external": "اجتماعات خارجية",
"giftsGroup": "الهدايا",
@@ -1709,6 +1712,38 @@
"roomsAvailableNow": "القاعات المتاحة الآن",
"giftsIssuedThisMonth": "الدروع المصروفة هذا الشهر"
},
"roomsDash": {
"title": "لوحة بيانات القاعات",
"roomsCount": "عدد القاعات",
"roomsBreakdown": "{{active}} نشطة · {{inactive}} معطلة",
"todayBookings": "حجوزات اليوم",
"weekBookings": "حجوزات الأسبوع",
"pendingBookings": "طلبات معلّقة",
"nextBooking": "أقرب حجز قادم",
"noUpcoming": "لا توجد حجوزات قادمة",
"startingNow": "يبدأ الآن",
"inDays_zero": "بعد أقل من يوم",
"inDays_one": "بعد يوم واحد",
"inDays_two": "بعد يومين",
"inDays_few": "بعد {{count}} أيام",
"inDays_many": "بعد {{count}} يوماً",
"inDays_other": "بعد {{count}} يوم",
"inHoursMinutes": "بعد {{hours}} ساعة و{{minutes}} دقيقة",
"inMinutes_zero": "بعد أقل من دقيقة",
"inMinutes_one": "بعد دقيقة واحدة",
"inMinutes_two": "بعد دقيقتين",
"inMinutes_few": "بعد {{count}} دقائق",
"inMinutes_many": "بعد {{count}} دقيقة",
"inMinutes_other": "بعد {{count}} دقيقة",
"bookingsOverTime": "الحجوزات عبر الأيام",
"lastNDays": "آخر {{count}} يوماً",
"bookings": "حجوزات",
"byRoom": "التوزيع حسب القاعة",
"byStatus": "التوزيع حسب الحالة",
"noData": "لا توجد بيانات بعد",
"noAccess": "ليس لديك صلاحية للوصول إلى هذه الصفحة.",
"windowHint": "تشمل الرسوم البيانية حجوزات آخر 30 يوماً بتوقيت الرياض."
},
"bookings": {
"new": "حجز جديد",
"edit": "تعديل الحجز",