Add missing X-Impersonation-Session-Id header to portal API calls in
AccountSettings, ReportCards, and Appointments components. Also add
sessionId prop to ReportCards since it was missing.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
- PasswordChange: add useState hooks for all 3 password fields, password-
match validation with inline error, disabled submit when fields are
empty/mismatched, wired onClick handler with TODO for API integration
- ReportCards: extract fetch into loadReportCards(), replace
window.location.reload() with loadReportCards() so SPA state (activeSection)
is preserved on retry
Refs: GRO-287
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Remove !readOnly guard from Pay Now button and PaymentModal in
BillingPayments.tsx. The readOnly guard was too broad, hiding the
Pay Now button during all impersonation sessions even though
impersonation is the only way staff can access a client's billing
page. Destructive actions (remove payment method, autopay toggle)
still respect the readOnly flag.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
GRO-264: The "Continue as default dev user" button on /login clears
dev-user from localStorage then navigates to /admin, but App.tsx's
auth guard immediately redirects back to /login because getDevUser()
is null. Fix by setting a dev-login-skipped flag that App.tsx checks
to allow through-navigation after explicit skip.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Rebase onto current main which has API-driven BillingPayments.
Adds Outstanding Balance banner with Pay Now button that opens
a payment modal for selecting and paying pending invoices.
Co-Authored-By: Paperclip <noreply@paperclip.ing>