v5.7 — April 17, 2026

Added

  • CompanyHolidaysModal ('src/components/modals/CompanyHolidaysModal.tsx') — editor/admin only. Loads all 'non_working_days' for the tenant with 'company_policy' field. Each row: dot (religious heuristic purple vs orange), date, country flag, reason, active policy badge, and 3 action buttons (Confirm / User Choice / Cancel). Buttons update local 'dateToPolicy' Map (deferred save). On Save: patches 'non_working_days.company_policy', then bulk-upserts or deletes 'person_holiday_preferences' for all team members per policy. Stats block shows confirmed / choice / unset / cancelled counts. Workspace avatar uses 'computeInitials' with 'border-radius: 8px'. '?' tooltip explains each policy option.
  • MyVacationModal ('src/components/modals/MyVacationModal.tsx') — available to all roles. Fetches current user's person record (by email) and 'non_working_days' with 'company_policy' on open; uses 'vacationRanges' + 'holidayPrefs' from GanttContext. Merges vacation ranges and holidays into one chronological list with year separators. Row types: 'vac-start' (yellow square, duration, Cancel/Undo), 'vac-end' (yellow square, no action), holiday 'company_policy='confirmed'' (gray circle, read-only), holiday 'user_choice'/'null' (purple triangle '▲', Confirm/Remove/Reset). All changes deferred in 'changedPrefs' Map and 'cancelledRanges' Set. Footer: legend + Save changes button showing pending count.
  • VacationPage toolbar — "Company holidays" (editor/admin, outline) and "My holidays" (all roles, outline) buttons added to the right of "+ Add vacation", left of the legend spacer.
  • VacationPage grid — 'getCellState' rewrite — full priority chain respecting 'company_policy': 'confirmed' → orange fill regardless of user pref; 'cancelled' → treated as working day; 'user_choice' or 'null' → checks 'person_holiday_preferences' (confirmed/pending/normal). Removed the obsolete ''skipped'' state.
  • VacationPage grid — year separator — 24px 'border-left' column inserted between December 31 and January 1 when 'allDays' spans multiple years. Month header shows the year label (e.g. "2027") in the separator slot. Dormant in current single-year mode; activates automatically when 'allDays' is extended to multi-year.

DB

  • 'non_working_days.company_policy' — new column (''confirmed'|'user_choice'|'cancelled'|null'). Added to 'NonWorkingDay' type in 'src/types/db.ts'.