Commit Graph
72 Commits
Author SHA1 Message Date
simandClaude Sonnet 5.5 1cff743015 Add bulk actions to admin order, user and registration link tables
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 2m3s
Row selection with a bulk bar: delete orders, delete/resend users,
delete/resend registration links. Each item runs independently with a
summary; failed rows stay selected. Orders table scrolls horizontally
on phones.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 23:35:10 +00:00
simandClaude Sonnet 5.5 a098f6f94c Remove order text from home orders list for a more compact view
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 23:29:15 +00:00
simandClaude Sonnet 5.5 0e94b1dba2 Add design for participation stats and podium stamps
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 23:28:21 +00:00
simandClaude Sonnet 5.5 a2e4321ac7 Rework My Orders stats and add responsive UI checks
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m44s
My Orders: year calendar and lunch profile first, chips and "How you
compare" removed, open and paid payments merged into one table (open
first, then newest). Activity is now a line chart with a cumulative
switch and finer buckets (daily up to ~3 months, weekly up to ~13).
Cards get subtle elevation and tighter spacing.

Responsive: phone tab strip instead of the side menu, heatmap fits
narrow screens, grouped column-chart labels are truncated, the manager
weekday table scrolls instead of overflowing.

Tooling: viewports.mjs (presets, overflow detector), shoot.mjs --sizes
and --select, tests/responsive.ui.spec.ts, docs/ui-testing.md.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 23:15:25 +00:00
simandClaude Sonnet 5.5 9d80e6d06e Add scheduled backups of database and uploads
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 7m9s
The backend now writes a timestamped tar.gz of the SQLite snapshot and all
per-order files to BACKUP_DIR on a cron schedule (default 03:00), keeps the
newest BACKUP_KEEP archives, and catches up once on start if a slot was
missed. Configurable via BACKUP_CRON / BACKUP_KEEP / BACKUP_DIR / TZ.
Includes user-facing restore docs in docs/backups.md.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 22:31:28 +00:00
simandClaude Sonnet 5.5 1df83afab1 Redesign statistics pages with global timeframe, insights and privacy scoping
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m55s
- Shared ChartCard/StatRow/CardGrid primitives for a consistent layout; fix
  clipped axis labels, green 100% bars and uneven tiles
- One page-wide timeframe filter; period-over-period deltas on stat tiles;
  per-period activity bars replace cumulative charts
- My Orders: lunch profile (personality, records, adventurousness), calendar
  and weekday x hour heatmaps, anonymous community comparison. /api/stats/me
  no longer returns other users' emails (organizers are numbered per response)
- Order Management: order insights, participant loyalty, median fill time,
  regulars and drop-offs, submission heatmap, top item per weekday
- Site Overview: adoption funnel, weekly retention, order sizes, order value,
  submission heatmap; active users now based on real contributions

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 22:21:43 +00:00
simandClaude Sonnet 5.5 b7eb2bb6d0 Add native dev stack and Playwright e2e/API tests
- src/dev/devenv.sh: run backend, Vite and Mailpit without Docker
- CONFIG_PATH env override for the backend config; optional Vite /api proxy
- src/e2e: Playwright API + UI tests (real email sign-in via Mailpit) and
  shoot.mjs screenshot CLI
- Document the workflow in CLAUDE.md

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 21:56:03 +00:00
Simon GruberandClaude Sonnet 5.5 c4aa7f00c2 Add cumulative time series with timeframe filter to all statistics pages
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m46s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 17:24:43 +01:00
Simon GruberandClaude Sonnet 5.5 d8b7871142 Add category drill-down to item rankings
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 17:19:42 +01:00
Simon GruberandClaude Sonnet 5.5 c812921a2b Implement statistics pages for orderees, order managers and site admins
Per-user pages get fact rows from /api/stats/me and /api/stats/managed and
aggregate client-side; the site overview is aggregated by /api/admin/stats.
Items that need new data are tracked as TODOs in docs/statistics.md.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 17:18:05 +01:00
Simon GruberandClaude Sonnet 5.5 70bd7642d4 Add statistics placeholder pages with sidebar navigation
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 17:13:17 +01:00
Simon Gruber b0dd62bc9b Dangerous instruction 2026-11-05 16:54:43 +01:00
Simon GruberandClaude Sonnet 5.5 cb4e610ea1 Add admin page navigation, user search and registration link resend
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m57s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 16:40:50 +01:00
Simon GruberandClaude Sonnet 5.5 5c1f4a77ef Make local dev stack react to file changes reliably
- Poll for file changes (Vite, watchfiles) since host bind mounts don't deliver events
- Limit uvicorn reload to the app directory
- Dev nginx config re-resolves container names per request to avoid 502 after restarts

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 16:26:40 +01:00
Simon GruberandClaude Sonnet 5.5 0481b71192 Add site admin order management page
- GET /api/admin/orders (site admins only): orders with owner email and submission count
- ensure_owner_access also grants confirmed ADMIN_EMAILS users, so admins can manage/delete any order
- Order table with search (title/email), icon actions (inspect, manage, delete), no horizontal scroll

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 16:26:40 +01:00
Simon GruberandClaude Sonnet 5.5 d2bf52fea1 Polish user management: single card with persisted tabs
- Tabs inside one card, selected tab remembered across reloads
- Register and refresh buttons in the card header
- Table stats (count / selected) below each table

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 15:55:40 +01:00
Simon GruberandClaude Sonnet 5.5 908756190a Rework user management into tabs with a single registration links table
- Users and Registration links tabs
- Active, used and expired links in one filterable table
- Register-new-user popover and refresh button in the card header

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 15:38:44 +01:00
Simon GruberandClaude Sonnet 5.5 485e3aadf6 Add Administration heading to account popover
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 15:23:51 +01:00
Simon GruberandClaude Sonnet 5.5 7f7e529b16 Add site admin user management page
- Admin API (/api/admin/users, registration links) guarded by require_site_admin:
  confirmed profile email must be in ADMIN_EMAILS, checked server-side
- Block unverified switches to an admin email (PUT /me/profile, X-User-Email)
- Users table with registration date, activity counters, resend and delete
- Create, view (active/previous) and delete registration links
- user_profiles.created_at column with backfill

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 15:04:45 +01:00
Simon GruberandClaude Sonnet 5.5 e3f2f44765 Add ADMIN_EMAILS admin users and rework account menu
- ADMIN_EMAILS env (compose) marks admins; /api/me/profile returns is_admin
- Crown badge on the user icon for admins
- Account popover as menu: admin links, email editor, logout
- Placeholder site admin pages (/admin/users, /admin/orders)
- Notification event text: built-in clear resets to default

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 13:39:49 +01:00
Simon GruberandClaude Sonnet 5.5 d15fe97584 Make templates editable for existing orders and add {date:iso}/{date:at} formats
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m48s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 10:28:31 +01:00
Simon Gruber 23fcc9774e Notification UI fixes
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m41s
2026-11-04 10:05:03 +01:00
Simon GruberandClaude Sonnet 5.5 80b9a67414 Replace notification center message previews with generic subtext
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m50s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 10:01:33 +01:00
Simon GruberandClaude Sonnet 5.5 f4509792bd Log webhook error response body on HTTP failures
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m39s
Receivers like Power Automate explain a 400 in the response body.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 09:52:41 +01:00
Simon GruberandClaude Sonnet 5.5 4ab56e6fb3 Allow image uploads up to 11 MB through nginx
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m37s
nginx defaults to 1 MB, so pasted screenshots failed with 413 and the order
was created without its image.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 09:38:56 +01:00
Simon GruberandClaude Sonnet 5.5 e60de3ac17 Add notification center, webhook editor and admin-only export
- Notifications tab (create and admin view) to manage webhooks, event texts
  and custom notifications
- Notification center card on the admin page for manual notifications
- Export restricted to order admins, optionally including notifications
- Payment details editable on existing orders (menu stays read-only)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 09:33:47 +01:00
Simon GruberandClaude Sonnet 5.5 cad2f4bef3 Add webhook notifications for order events
Order admins can configure webhooks per order (admin-only endpoints, stored
next to the other per-order files and removed with the order). Preset events:
order created/closed/opened, last call and delivery started, with
customizable texts. Admins can define custom notifications and send manual
ones through POST /admin/notifications/send.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 09:33:47 +01:00
Simon GruberandClaude Sonnet 5.5 6a896304de Add CLAUDE.md
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 09:33:46 +01:00
Simon Gruber 1b1b0898ed Order management UI
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m30s
2026-10-21 08:29:47 +02:00
Simon Gruber 6ae0361971 Order management UI
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m31s
2026-10-21 08:25:37 +02:00
Simon Gruber b2f9ca7c18 Order management UI
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m27s
2026-10-21 08:20:19 +02:00
Simon Gruber 24e186debc Strings
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m26s
2026-10-21 08:08:49 +02:00
Simon Gruber 616ac5583f payment ux refinement
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m37s
2026-10-21 08:07:44 +02:00
Simon Gruber e53f814451 Improve paypal QR code
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m25s
2026-10-21 08:00:28 +02:00
Simon Gruber a13c89c5b1 payment ux refinement
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m28s
2026-10-21 07:51:50 +02:00
Simon Gruber 3a0a85c263 Update strings
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m25s
2026-10-21 07:45:10 +02:00
Simon Gruber 317e9ad910 mv tempaltes and payment to order creation
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m30s
2026-10-21 07:22:52 +02:00
sim 5808da2606 Add order ID to print output
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 2m23s
2026-10-20 22:05:06 +02:00
sim d45e71a4ba Allow pasting image on order creation
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m57s
2026-10-20 22:03:51 +02:00
sim a218405f34 strings
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m49s
2026-10-20 22:01:03 +02:00
sim 9e25c6da04 Payment details integration
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m57s
2026-10-20 21:58:20 +02:00
sim f2cbc07738 add printing
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m49s
2026-10-20 21:33:45 +02:00
sim d3517d8f47 Add handed-out flag and distribution mode
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m34s
2026-10-20 21:24:07 +02:00
sim 7d5ce7bcc8 Add clipboard and email templating
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m37s
2026-10-20 21:15:55 +02:00
sim d813fc0b5b Display current selection count
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 2m8s
2026-10-20 20:53:28 +02:00
sim 4fd528789d Add devcontainer env 2026-10-17 21:33:08 +02:00
Simon GruberandCopilot 1ff82ec2ba Enhance mobile UI
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m39s
Co-authored-by: Copilot <copilot@github.com>
2026-05-07 10:53:11 +02:00
Simon GruberandCopilot cacdb5b2bd Enhance mobile UI
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 1m41s
Co-authored-by: Copilot <copilot@github.com>
2026-05-07 10:44:31 +02:00
Simon Gruber 7cf05d5801 Make chips wrap 2026-05-07 10:01:23 +02:00
Simon Gruber e489b045fc Remove admin view pagination
Build and Push Lunchtime Images (Kaniko) / build-and-push (push) Successful in 2m12s
2026-05-07 07:45:55 +02:00