Commit Graph

2256 Commits

Author SHA1 Message Date
Replit Agent 2e7152fef7 Task #755: restore rounded corners on executive meetings table
- User preferred the rounded look; reverted #747's corner squaring:
  rounded-t-md back on the sticky floating header (em-sticky-thead),
  rounded-b-md on the table wrapper (#executive-schedule-printable).
- Used rounded-b-md instead of the original full rounded-md because the
  header is now attached flush to the table (#749/#751) — the seam must
  stay a straight continuous line.
- !mb-0/!mt-0 attachment, sticky behavior, and print mode untouched.
- tx-os tsc clean; architect review passed.
2026-07-09 10:59:37 +00:00
Replit Agent b75f867cfb Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 6485e1b3-18dd-4016-87f6-dc52c195d9a1
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/Uco2EKd
Replit-Helium-Checkpoint-Created: true
2026-07-09 10:58:14 +00:00
Replit Agent 0586d996b7 Task #753: revert row spacing in executive meetings table to pre-#747
- User preferred the original row density; reverted the tightening only:
  meeting/attendees/time/merged tbody cells py-1.5→py-3, number cell
  py-1.5→py-2, AttendeesCell split-mode wrapper space-y-1→space-y-2.
- Kept the square corners (#747) and the header-attached-to-table fix
  (!mb-0 on em-sticky-thead, !mt-0 on wrapper from #749/#751).
- tx-os tsc clean; grep confirms no tightened values remain; architect
  review passed.
2026-07-09 10:55:30 +00:00
Replit Agent e1092d7333 Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: ae4a6705-b56b-4843-a0dd-b98986225b23
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/Uco2EKd
Replit-Helium-Checkpoint-Created: true
2026-07-09 10:53:56 +00:00
Replit Agent 984e51394d Task #751: remove remaining gap between sticky header and table
- Root cause: Tailwind v4 space-y-* applies margin-block-end on
  :not(:last-child) children (verified in tailwindcss 4.2.1 dist), so
  #749's !mt-0 on the table wrapper had no effect — the 1rem gap came
  from margin-bottom on the floating header itself.
- executive-meetings.tsx: added !mb-0 to em-sticky-thead div; kept
  !mt-0 on the wrapper as a harmless safeguard.
- Header (border-t/x, no bottom) now sits flush on the table's
  border-2 top → single 2px seam. Sticky/translateX/print untouched.
- tx-os tsc clean; architect review passed.
2026-07-09 10:52:06 +00:00
Replit Agent e3a612f5dc Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 661370f1-5c17-4ee3-99c9-b5ed37c0eb41
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/Uco2EKd
Replit-Helium-Checkpoint-Created: true
2026-07-09 10:49:58 +00:00
Replit Agent 0f0a9c63eb Task #749: attach executive meetings sticky header to the table
- executive-meetings.tsx: added !mt-0 to the schedule table wrapper
  (#executive-schedule-printable) to cancel the parent space-y-4 gap,
  so the dark floating header (em-sticky-thead) sits flush on the table.
- Border seam stays a single 2px line: header has border-t-2/border-x-2
  (no bottom), wrapper keeps border-2.
- No changes to sticky behavior, horizontal scroll sync, or print mode.
- tx-os tsc clean; architect review passed.
2026-07-09 10:43:28 +00:00
Replit Agent 515a0eba36 Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 0005ea22-9d04-4f87-aad2-a69f147b0a9f
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/Uco2EKd
Replit-Helium-Checkpoint-Created: true
2026-07-09 10:42:05 +00:00
Replit Agent c61936ee6d Task #747: executive meetings table — square corners + tighter rows
- executive-meetings.tsx: removed rounded-md from the schedule table
  wrapper and rounded-t-md from the sticky floating thead; navy 2px
  border unchanged, corners now fully square.
- Reduced vertical padding in tbody cells: meeting/attendees/time/merged
  cells py-3→py-1.5, number cell py-2→py-1.5.
- AttendeesCell split-mode group wrapper space-y-2→space-y-1 to shrink
  the empty gaps in multi-group attendee rows (screenshot complaint).
- Print thead and screen thead paddings untouched; no behavior changes.
- tx-os tsc clean; architect review passed.
2026-07-09 10:38:00 +00:00
Replit Agent fb4389cab9 Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: cbe0f87a-c01e-4ee9-8fa7-27d49019d32e
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/Uco2EKd
Replit-Helium-Checkpoint-Created: true
2026-07-09 10:35:04 +00:00
Replit Agent 36a723d47e Task #745: allow collapsing sidebar groups even when a child tab is active
- protocol.tsx: `open` for roomsGroup/gifts group now follows only the
  user-controlled state (roomsGroupOpen/giftsGroupOpen) instead of
  `...Open || groupActive`, so the chevron actually collapses the group
  while you're inside one of its tabs (e.g. «الإعدادات»).
- Added a useEffect on `tab` that auto-opens the containing group when
  the active tab becomes one of its children (initial load, deep link,
  or tab switch), so the active item is never hidden unintentionally.
- Group header keeps its text-sky-600 highlight when collapsed with an
  active child (existing styling, unchanged).
- tx-os tsc clean; architect review passed.
2026-07-09 10:19:31 +00:00
Replit Agent f257009130 Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 3bd95aff-5ff4-4018-8050-87df8a967461
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/Uco2EKd
Replit-Helium-Checkpoint-Created: true
2026-07-09 10:17:26 +00:00
Replit Agent 41c6184b92 Task #743: sidebar «إدارة القاعات» — clearer labels + submenu distinction
- ar.json: protocol.tabs.bookings «حجز القاعات»→«الحجوزات», bookingSettings «إعدادات الحجوزات»→«الإعدادات»
- en.json: "Room Bookings"→"Bookings", "Booking Settings"→"Settings"
- Same keys also serve as page headings (accepted per task), so headings change too.
- protocol.tsx: submenu children of roomsGroup and gifts group now wrapped in a
  container with md:ms-4 md:border-s-2 md:border-slate-300 md:ps-1 (vertical
  guide line + indent, RTL-safe logical props); removed per-button md:ps-6.
  Mobile horizontal layout unchanged.
- tx-os tsc clean; architect review passed.
2026-07-09 10:10:49 +00:00
Replit Agent 271a150246 Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 4afb7057-391e-47d9-8cc8-0ea15e670344
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/Uco2EKd
Replit-Helium-Checkpoint-Created: true
2026-07-09 10:07:51 +00:00
Replit Agent 5dab20a526 Task #741: تغيير اسم التطبيق إلى «المراسم والعلاقات العامة»
- ar.json protocol.title: «العلاقات العامة والمراسم» → «المراسم والعلاقات العامة».
- en.json protocol.title: "Public Relations & Protocol" → "Protocol & Public Relations".
- Dev DB: UPDATE apps (slug='protocol', id 11015) name_ar/name_en to new order.
- scripts/src/seed.ts: protocol app entry updated to the new names.
- lib/db/scripts/pre-push-cleanup.ts: new idempotent step renaming the
  protocol apps row on every push so production gets the new tile name.
  Verified by running the script against dev DB ("already up to date").
- pnpm --filter @workspace/tx-os exec tsc --noEmit clean; architect review passed.
2026-07-09 10:04:39 +00:00
Replit Agent 93f0fae94b Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 4dcb3b2f-17d2-4ca3-a588-3e5be67eb05c
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/Uco2EKd
Replit-Helium-Checkpoint-Created: true
2026-07-09 10:01:33 +00:00
Replit Agent 409b2c6fd5 Task #739: تحويل تبويب القاعات من بطاقات إلى جدول
- protocol.tsx (tab === "rooms"): replaced the 2-column card grid with a
  Table styled like the bookings table (bg-slate-100/80 header, centered
  headers/cells) with columns: # | القاعات | الحالة | الإجراء.
  - # = sequential index; name via nameOf with capacity line beneath.
  - Status badge keeps emerald-100 / slate-200 colors.
  - Actions column (edit/delete, same setRoomDialog/setDeleteTarget
    handlers) rendered only when canManageRooms.
  - EmptyState (rooms.empty), "قاعة جديدة" button, and dialogs unchanged.
- i18n: added protocol.rooms.status ("الحالة"/"Status") and
  protocol.rooms.actions ("الإجراء"/"Action") to ar.json and en.json.
- Verified: pnpm --filter @workspace/tx-os exec tsc --noEmit clean;
  architect review passed with no blocking issues.
2026-07-09 09:58:09 +00:00
Replit Agent e2afc0bb28 Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 3dee3b0e-1ce5-4f7f-9d3c-fb8990a3fd42
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/Uco2EKd
Replit-Helium-Checkpoint-Created: true
2026-07-09 09:54:14 +00:00
Replit Agent a1acbc8017 Task #737: fix reversed ص/م (AM/PM) in Arabic booking time ranges
- Root cause: time-range containers forced dir="ltr" while the strings mix
  Latin digits with Arabic ص/م, so the bidi algorithm flipped the segments
  (showed "م - 1:30 م 12:30" instead of "12:30 م – 1:30 م").
- artifacts/tx-os/src/pages/protocol.tsx:
  - fmtTimeOnly now uses "ar-u-nu-latn" in Arabic (Latin digits kept) and
    is rendered in the natural RTL flow.
  - Removed dir="ltr" from: bookings list time cell, day-grid booking block
    time, and details dialog time range.
- fmtSlotRange / fmtSlotLabel callsites already use locale-aware dir (rtl
  in Arabic) — unchanged. English display unchanged.
- tsc clean; architect review passed.
2026-07-09 09:36:45 +00:00
Replit Agent 9e3200e2de Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: c695a2e9-01e3-4ee6-8fd7-b2c80efaad73
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/Uco2EKd
Replit-Helium-Checkpoint-Created: true
2026-07-09 09:33:59 +00:00
Replit Agent 86b2d64f5c Task #735: booking reference digits-only (no letters)
- makeBookingReference in artifacts/api-server/src/routes/protocol.ts now
  returns `${year}-${pad4(id)}` instead of `RB-${year}-${pad4(id)}`.
- Backfilled 7 existing dev DB rows: stripped "RB-" prefix via
  regexp_replace; verified 0 rows contain letters, unique/NOT NULL intact.
- lib/db/scripts/pre-push-cleanup.ts updated (architect-review finding):
  NULL backfill now uses digits-only format, plus a new idempotent
  normalization step that strips legacy "RB-" prefixes on every push.
- Frontend unchanged: bookingNumber() already strips non-digits; details
  card and public booking success page display the raw reference which is
  now digits-only. ilike search still works.
- tsc clean for tx-os and lib/db; API workflow restarted.
2026-07-09 09:17:43 +00:00
Replit Agent 1d2ff5e6b9 Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 55381c9e-52dd-489c-833f-588fcecea611
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/ZgwFc55
Replit-Helium-Checkpoint-Created: true
2026-07-09 09:11:43 +00:00
Replit Agent 7d5590b3e6 Task #733: dark outline around expanded booking + its details; removed "اسم الاجتماع" label
- protocol.tsx renderBookingRow: cell-level framing (robust with collapsed
  tables per review): when expanded, booking-row cells get border-t-2
  slate-500 plus border-s-2/border-e-2 on first/last cells (logical props
  → RTL-safe); the details row's single colSpan cell gets border-x-2
  border-b-2 slate-500. Result: one continuous dark frame around the
  booking row + details block, immune to TableBody's tr:last-child
  border reset.
- Details card header: removed the small "اسم الاجتماع" label span; only
  the meeting title (b.title, centered, bold) remains.
- Deleted the now-unused protocol.bookings.table.title key from ar.json
  and en.json (verified no remaining usages, JSON parses).
- UI-only; tsc --noEmit clean.
2026-07-09 09:08:18 +00:00
Replit Agent 258b6f0052 Task #733: dark outline around expanded booking + its details; removed "اسم الاجتماع" label
- protocol.tsx renderBookingRow: when expanded, the booking row gets
  border-2 border-b-0 border-slate-500 and the details row gets
  !border-2 !border-t-0 !border-slate-500 — one continuous dark frame
  around the whole block. Important modifiers on the details row defeat
  TableBody's [&_tr:last-child]:border-0 reset so the frame survives when
  the expanded booking is the last row (architect review fix). Removed the
  old inner border-b slate-400 on the details container.
- Details card header: removed the small "اسم الاجتماع" label span; only
  the meeting title (b.title, centered, bold) remains.
- Deleted the now-unused protocol.bookings.table.title key from ar.json
  and en.json (verified no remaining usages, JSON parses).
- UI-only; tsc --noEmit clean.
2026-07-09 09:06:27 +00:00
Replit Agent e56fdeafce Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: c41ad0e9-e89f-4b5e-9ba1-7a28090ff925
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/ZgwFc55
Replit-Helium-Checkpoint-Created: true
2026-07-09 09:02:14 +00:00
Replit Agent 1b23d3a8e3 Task #731: details card square corners, attached to booking row, centered cell text
- Expanded booking details in protocol.tsx: TableCell padding p-3 → p-0 so
  the card attaches directly to the booking row with no gap.
- Card container: removed rounded-lg and side border; now border-b
  border-slate-400 only — square corners, flush with table edges.
- Details TableRow gets border-b-0 to avoid a double bottom separator with
  the inner border (architect review fix).
- Grid detail cells (مقدم الطلب، الإدارة، الهاتف...) now text-center for
  both label and value; meeting-name header also centered for consistency.
- UI-only; tsc --noEmit clean.
2026-07-09 08:58:54 +00:00
Replit Agent ac9af6d065 Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: c3a082ff-a8a0-490d-b1b1-8ea9688dcb98
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/ZgwFc55
Replit-Helium-Checkpoint-Created: true
2026-07-09 08:56:00 +00:00
Replit Agent 5d30535955 Task #729: darker borders in booking details card + bigger centered attendees heading
- Expanded booking details card in protocol.tsx: outer frame slate-200 →
  slate-400; header/grid row and column dividers slate-100/200 → slate-300
  so the grid reads as a real table.
- AttendeesTable: border darkening is flush-mode only (flush top border,
  header row slate-300, body rows slate-200); dialog (non-flush) keeps its
  previous lighter shades per architect review fix.
- "أبرز الحضور" heading: text-center text-base font-bold text-slate-900
  (was text-sm text-slate-800).
- UI-only; tsc --noEmit clean; architect issue addressed.
2026-07-09 08:50:59 +00:00
Replit Agent 4eec0bf43a Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 6dad99e7-d4c1-466a-b826-6e7474d178a1
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/ZgwFc55
Replit-Helium-Checkpoint-Created: true
2026-07-09 08:48:24 +00:00
Replit Agent 146de91640 Add numbering to attendees list and style the title
Update styling for the key attendees section title to be centered, larger, and bolder. Add a numbering column to the key attendees table.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 68c08cb0-3e5d-40e9-b8bc-df7ff1b2fd8d
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/ZgwFc55
Replit-Helium-Checkpoint-Created: true
2026-07-09 08:41:04 +00:00
Replit Agent b9b9b37636 Task #727: flush attendees table + rose external pill + darker card text
- AttendeesTable got optional `flush` prop: flush mode drops
  rounded-xl/border/shadow, uses only border-t so the table attaches
  full-width inside the expanded booking details card. Dialog usage
  unchanged (non-flush card style).
- Attendee side "خارج الهيئة" pill changed violet → rose
  (bg-rose-100 text-rose-700), matching the external booking badge.
- Darker text in expanded card: title text-slate-900; grid values
  text-slate-800 font-semibold; removed max-w-2xl width cap.
- UI-only; tsc --noEmit clean; architect PASS.
2026-07-09 08:25:45 +00:00
Replit Agent b27539a9ba Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: c9eb9e10-9bc9-442d-89da-74da23859524
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/ZgwFc55
Replit-Helium-Checkpoint-Created: true
2026-07-09 08:23:46 +00:00
Replit Agent a4bf222dc4 Task #725: red "external" badge + structured expanded booking details table
- protocol.tsx bookings table: external meeting-type badge changed from
  violet to rose (bg-rose-100 text-rose-700); internal unchanged.
- Expanded row rebuilt as a professional card-table: header row with
  meeting title (label above value, full width), grid of labeled cells
  (requester, department, phone, entity for external only, meeting type,
  attendee count, booking reference, purpose) with light dividers,
  keyAttendees AttendeesTable section below, rejection reason as a red
  banner row.
- Added i18n key protocol.bookings.table.title (ar: "اسم الاجتماع",
  en: "Meeting name").
- UI-only; tsc --noEmit clean; HMR applied; architect review PASS.
2026-07-09 08:19:42 +00:00
Replit Agent 16b42a3125 Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: fbecaa34-ac97-42b5-9b86-443ca4f5388b
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/ZgwFc55
Replit-Helium-Checkpoint-Created: true
2026-07-09 08:16:35 +00:00
Replit Agent 42efb18eb6 Task #723: navy KPI numbers in rooms dashboard + compact next-booking row
- protocol.tsx RoomsDashboardView: KPI numbers changed from text-sky-600
  to navy text-[#0f1d3d], matching the main dashboard styling from #722.
- "أقرب حجز قادم" gradient banner compacted: p-4 → px-3 py-2, content now
  a single inline flex row (label + title + room/time), countdown chip
  reduced (px-2.5 py-0.5 text-sm). Empty/loading state also compact.
- No logic or data changes; tsc --noEmit clean; HMR applied; architect PASS.
2026-07-09 07:59:34 +00:00
Replit Agent 6fd346692e Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 7340af18-9dd9-4806-bafb-f3f45d110cd1
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/ZgwFc55
Replit-Helium-Checkpoint-Created: true
2026-07-09 07:57:08 +00:00
Replit Agent c747bec99e Update dashboard styling to use navy for icons and numbers and adjust sidebar colors
Modify the ProtocolPage component to change the background and border of the sidebar, update the active and inactive link styles, and change the primary icon color to navy.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: bb2276a0-b7c6-4f0c-b8ab-29ed0f8d8aec
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/ZgwFc55
Replit-Helium-Checkpoint-Created: true
2026-07-09 07:54:32 +00:00
Replit Agent 4315988e78 Update menu design and add toggle functionality for better responsiveness
Add a menu toggle button to show/hide the sidebar. Update locale files for `menuToggle` key. Refactor `protocol.tsx` to manage menu state, adjust layout for responsiveness, and apply square corners to the menu.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 470babcf-8feb-4bdb-8f18-66e74df799e6
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/ZgwFc55
Replit-Helium-Checkpoint-Created: true
2026-07-09 06:37:50 +00:00
Replit Agent 3ed91778b2 Task #720: Dark navy protocol sidebar menu
- protocol.tsx sidebar nav (~lines 1413-1543): the tabs menu now sits on a
  dark navy panel (rounded-xl bg-[#0f1d3d] p-2) matching the user's reference
  image, clearly separated from the light page background.
- Item styles adapted for the dark background:
  - Active tab: white pill with navy text (bg-white text-[#0f1d3d] font-semibold).
  - Inactive tabs: text-slate-300 with hover:bg-white/10 hover:text-white.
  - Group headers (rooms/gifts): active = text-sky-300, inactive same as tabs.
- No logic changes (TABS, permissions, group collapse untouched); mobile
  horizontal scroll mode keeps the same dark panel.
- tsc --noEmit clean. Style-only change, no API/i18n changes.
2026-07-09 06:15:16 +00:00
Replit Agent 406db18797 Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: da2f3322-16f4-462d-bc6b-8ad4d6dcec77
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/ZgwFc55
Replit-Helium-Checkpoint-Created: true
2026-07-09 06:13:39 +00:00
Replit Agent 7daaf6f2f0 Task #718: Numbered key-attendees table auto-synced with expected attendee count
- New shared component artifacts/tx-os/src/components/attendee-table-editor.tsx:
  AttendeeTableEditor (# | name | position | side select | remove), plus
  syncAttendeeRows/emptyAttendeeRow helpers and MAX_ATTENDEE_ROWS=50 cap.
- Internal booking dialog (protocol.tsx): replaced the two side-by-side
  BookingAttendeeColumn lists with the single numbered table; each row now
  carries its own side. Edit mode prefills existing keyAttendees then pads
  to attendeeCount. useEffect syncs row count with the attendeeCount field:
  growing adds empty rows, shrinking removes only empty trailing rows (never
  filled ones), min 1 row.
- Public form (protocol-request.tsx): same conversion (AttendeeColumn removed,
  Arabic labels passed directly since the page is forced-RTL Arabic).
- Submission payload unchanged: only rows with non-empty name sent, same
  keyAttendees {name, position, side} shape — no API/schema changes.
- i18n: added protocol.bookings.form.side ("الجهة"/"Side") in ar.json/en.json.
- Removed dead code (BookingAttendeeColumn, AttendeeColumn, AttendeeRow type,
  unused Plus/X imports in protocol-request).
- Verified: tsc --noEmit clean; page serves 200; architect review PASS.
- Follow-up proposed: #719 UI test for count sync/prefill/submit.
2026-07-09 06:03:40 +00:00
Replit Agent 3cf4aae18e Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: b18cdf1b-39b5-433f-9939-bfcfb9f4ae75
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/ZgwFc55
Replit-Helium-Checkpoint-Created: true
2026-07-09 05:58:14 +00:00
Replit Agent e3484819dc Task #716: Booking slots — edit dialog + compact numbered table
- SlotsAdminSection (artifacts/tx-os/src/pages/protocol.tsx): replaced the
  2-column card grid of booking slots with a compact shadcn Table sorted by
  startTime: # | time range | duration | days | status | actions.
  Rows are dense (py-1.5, small text, h-7 icon buttons), RTL/LTR safe.
- New edit flow: pencil button opens a Dialog to change start time, duration
  (5–480, step 5) and days-of-week (same day-chip UI as the generator).
  Saves via existing PATCH /api/protocol/booking-slots/:id (no backend
  changes needed — route already accepted startTime/durationMinutes/daysOfWeek).
  409 duplicate_slot shows a dedicated destructive toast; other errors fall
  back to the shared onError. Invalidates slots-admin + parent slots queries.
- i18n: new keys under protocol.slots in ar.json/en.json (colTime, colStatus,
  colActions, edit, editTitle, editSaved, duplicateSlot, durationValue with
  full Arabic plural categories).
- tsc --noEmit passes for tx-os. Architect review: Pass; added the suggested
  <=480 client-side duration guard.
- Follow-up #717 proposed (UI test for edit + 409 toast).
2026-07-09 05:54:18 +00:00
Replit Agent 893b3d5bfb Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 6a17c6cd-b780-4128-9961-becb0e8426a0
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/ZgwFc55
Replit-Helium-Checkpoint-Created: true
2026-07-09 05:49:59 +00:00
Replit Agent 89331004f3 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).
2026-07-08 20:39:29 +00:00
Replit Agent 81dd7b708f Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 196a45c9-4ecf-4b59-a6af-904354bd7ede
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/ZgwFc55
Replit-Helium-Checkpoint-Created: true
2026-07-08 20:30:26 +00:00
Replit Agent b56f1682a9 Task #710: Weekly availability intervals (Calendly-style) for protocol booking slots
- DB: protocol_booking_slots.days_of_week integer[] NOT NULL default {0..6} (0=Sun..6=Sat, Riyadh); pushed via drizzle-kit, legacy rows keep all-days behaviour.
- API (routes/protocol.ts): slot create/patch accept daysOfWeek (validated, deduped, sorted); new POST /protocol/booking-slots/generate (requireManageRooms) generates stepped slots in [from,to); duplicate rule is day-scoped: same start time on a different day merges the days into the existing slot (existing duration kept), fully covered times skipped; returns {created,merged,skipped,slots}; manual POST create also merges disjoint days instead of 409; matchesActiveSlot and public availability filter by Riyadh weekday.
- UI (protocol.tsx): interval-generation form (from/to/duration + day toggle pills + workdays/all-days presets), toast shows created/merged/skipped, slot list shows day names, booking dialog filters slots by chosen date weekday with stale-selection reset and empty-day hint. i18n keys added (ar/en).
- Tests: 13/13 pass incl. generation, day-scoped merge (same time different day is NOT a duplicate), duplicate skipping, validation, weekday filtering in availability + booking rejection, viewer 403 on generate.
2026-07-08 20:20:30 +00:00
Replit Agent 19e6693200 Task #710: Weekly availability intervals (Calendly-style) for protocol booking slots
- DB: protocol_booking_slots.days_of_week integer[] NOT NULL default {0..6} (0=Sun..6=Sat, Riyadh); pushed via drizzle-kit, legacy rows keep all-days behaviour.
- API (routes/protocol.ts): slot create/patch accept daysOfWeek (validated, deduped, sorted); new POST /protocol/booking-slots/generate (requireManageRooms) generates stepped slots in [from,to) skipping existing start times (onConflictDoNothing), returns {created,skipped,slots}, 400 interval_too_short; matchesActiveSlot and public availability now filter by Riyadh weekday.
- UI (protocol.tsx): interval-generation form (from/to/duration + day toggle pills + workdays/all-days presets), slot list shows day names, booking dialog filters slots by chosen date weekday with stale-selection reset and empty-day hint. i18n keys added (ar/en).
- Tests: 13/13 pass incl. generation, duplicate skipping, validation, weekday filtering in availability + booking rejection, viewer 403 on generate.
- Architect review: Pass; added the suggested authz test.
2026-07-08 20:16:33 +00:00
Replit Agent de407b6a8d Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 5b26c109-9a5c-47da-9dea-bc14e4fc54ac
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/1d5UAHB
Replit-Helium-Checkpoint-Created: true
2026-07-08 20:06:57 +00:00
Replit Agent 57bb2e83cc Task #709: إخفاء رابط الحجز العام وإضافة زر فتح
- شريط "رابط الحجز العام (للمشاركة مع الضيوف)" في صفحة المراسم:
  - أُزيل عرض نص الرابط الكامل (بقي العنوان والأيقونة فقط).
  - أُضيف زر "فتح" (ExternalLink) بجانب زر "نسخ الرابط" يفتح
    publicBookingUrl في تبويب جديد عبر window.open مع noopener,noreferrer.
  - زر النسخ يعمل كما هو دون تغيير.
- مفاتيح ترجمة جديدة: protocol.bookings.openLink (ar: "فتح", en: "Open").
- لا تغييرات في الخادم. tsc نظيف. مراجعة architect: Pass.
2026-07-08 19:58:29 +00:00