Files
Bookra/FRONTEND_ISSUES.md
T
Tomas DvorakandDevin 27e0feaed6 docs: refresh README for current state
README described an old blue palette and no product features. Now lists
the actual feature surface (booking, waitlists, schedules, intake,
metrics, exports, feeds, notifications, i18n, Stripe/SMS), correct demo
tenant slug, and the real warm-cream/terracotta token palette.
FRONTEND_ISSUES open-items count updated to current (~60 ternaries).

Authored By: TDvorak <[email protected]>

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-22 19:53:29 +02:00

4.7 KiB

Frontend Issues Found During Production-Readiness Review

Fixed During This Pass

  • Landing pricing showed outdated EUR tiers and a 14-day trial. The product copy now uses CZK-first pricing with USD equivalents and a 30-day trial.
  • SMS reminder copy appeared in features, testimonials, and pricing. The main customer-facing copy now says email reminders instead.
  • Czech home.step2.desc was missing and leaked the translation key on the landing page.
  • Footer year was stale.

Fixed This Session

  • The dashboard unauthenticated state replaced with a dedicated conversion screen (headline, benefit cards, Sign In / Demo CTAs, register link).
  • The pricing highlight label now uses the home.pricing.popular i18n key in both home-route.tsx and pricing-route.tsx.
  • The mobile booking page now smooth-scrolls to the contact form and highlights it when a user taps a slot without filling required details, breaking the validation loop.
  • The IntegrationModal widget snippets now derive the base URL from publicBookingUrl instead of hardcoding bookra.eu, fixing local dev and custom domain scenarios.
  • Email settings section now has a working Save Email Settings button with loading state, wired to PUT /v1/tenants/email-settings.

Fixed This Session (continued)

  • Accessibility: Added aria-label attributes to all icon-only buttons in the dashboard (calendar nav, notifications, modal close buttons, mobile menu).
  • Widget-builder UX: Replaced console.error on copy failure with a user-visible error banner.
  • Booking-manage route: Contact email now uses businessEmail from booking data instead of hardcoded [email protected].
  • Loading states: Added spinners and disabled states to booking create/update buttons and brand save button.
  • i18n cleanup: Added 30+ new dashboard.* keys to the i18n dictionary and replaced ~20 inline ternary expressions with i18n.t() calls across nav items, page titles, status labels, and action buttons.

Still Needs Frontend Polish

  • Dashboard inline i18n ternaries remain (~60 as of M30). Systematic extraction to i18n.t() keys is an ongoing task.
  • Registration cannot be fully customer-tested locally until Neon Auth environment variables are configured.

Fixed This Session (platform audit pass)

  • Billing checkout sends planCode/currency/billingInterval and reads checkoutUrl (was {interval}/url — broken end-to-end). Plan selector added to the billing page.
  • Billing page now reads normalized backend fields (status, planCode, trialDays, maxBookingsMonth).
  • Zones page rewired to real catalog APIs: locations CRUD, blocked days CRUD, working-hours persistence — all three tabs now functional.
  • Customers page loads GET /v1/catalog/customers instead of hardcoded mock rows (demo mode keeps sample data).
  • Settings email-template editor now loads saved templates via GET /v1/tenants/email-templates and saves with isEnabled.
  • Dead code removed: dashboard-route.tsx, dashboard-route.tsx.backup, lib/paddle.ts, lib/stripe.ts, @paddle/paddle-js, @stripe/stripe-js.
  • Demo bootstrap slug aligned with backend demo tenant (studio-atelier).
  • Paddle mentions replaced by Stripe in legal + i18n copy.
  • @neondatabase/neon-js bumped to 0.7.0-beta — npm audit now reports 0 vulnerabilities.

Fixed This Session (class roster + waitlist promotion)

  • Class sessions in the zones classes tab now show a N waiting badge and expand into a two-column roster panel — confirmed attendees vs waitlist with #N queue positions, names, emails, and booking references.
  • Waitlisted roster entries have a Confirm seat action; when the session is full the backend returns 409 and the button re-arms into an explicit "confirm anyway" over-capacity step rather than silently overriding.
  • The booking detail modal now shows the waitlist position for waitlisted bookings and offers the same promote action (accent button above cancel); the bookings list badges waitlisted rows with their #N position.
  • Demo mode seeds a class session with a populated roster; mutation attempts surface the demo notice instead of failing. Verified in-browser in both Czech and English with a clean console.

Fixed This Session (customer rebooking + ICS calendar feeds)

  • Manage-booking reschedule dialog replaces free-form date/time inputs with a real slot picker: pick a date → live availability filtered by the booking's service/staff → time buttons carrying the slot's own duration. Reschedule action is status-gated (confirmed/pending appointments only); class bookings get an explanatory note instead of a broken button.
  • Settings gains a "Kalendář (ICS)" card: copyable feed URLs for the whole business and each staff member, two-step rotate-to-invalidate control, demo-mode rows backed by real seeded tokens.