feat(frontend): workday summary modal, print analytics UI, staff zone-PIN management, report upgrades

manager_dashboard:
- DashboardPage: WorkdaySummaryModal integration (view / close-day flows); revenue chart upgrades
- WorkdaySummaryModal: new component — shows full shift/revenue summary before closing the day
- StaffTab: full rewrite — zone-assignment modal, reset-PIN modal, actions dropdown, richer staff card
- ProductsTab: digital-menu fields surfaced in product form
- PrintFontsTab: expanded font-size/weight controls per printer channel
- TablesConfigTab / TablesPage / tableColourStore: color picker and zone fields for tables
- FilterBar: unified filter component with date-range, printer, and category selectors
- CategoryPerformance / ProductPerformance / TableAnalytics: donut/bar charts,
  thermal+browser print modals, richer breakdown tables
- PrinterHistory: redesigned with per-printer drill-down and summary blocks
- TrafficAnalytics / WorkDaySummary / RevenueTrends / ShiftsOverview / StaffLeaderboard: polish pass
- tokens.js: design token updates

waiter_pwa:
- TableCard: show table color indicator from zone/colour config

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-07 20:28:23 +03:00
parent 79bd3b0f41
commit ac7ec45279
21 changed files with 3353 additions and 645 deletions

View File

@@ -636,6 +636,11 @@ export default function TableCard({
'4x3': Card4x3,
}[density] || Card2x2
const reservation = table.upcoming_reservation ?? null
const reservedTime = reservation
? new Date(reservation.reserved_for).toLocaleTimeString('el-GR', { hour: '2-digit', minute: '2-digit' })
: null
return (
<div style={{ position: 'relative', minWidth: 0, overflow: 'hidden' }}>
<button
@@ -651,6 +656,21 @@ export default function TableCard({
>
<CardComponent {...cardProps} />
</button>
{reservation && (
<div style={{
position: 'absolute', top: 6, left: 6, zIndex: 10,
pointerEvents: 'none',
}}>
<span style={{
display: 'inline-flex', alignItems: 'center', gap: 3,
background: '#4f46e5', color: '#e0e7ff',
fontSize: 9, fontWeight: 800, letterSpacing: 0.3,
borderRadius: 4, padding: '2px 6px',
}}>
🔒 {reservedTime}
</span>
</div>
)}
{showTip && flags.length > 0 && (
<div style={{