Bug 556 triggered a broader audit of every date input in the app:
- appointment-form DatePicker now has minValue=today(getLocalTimeZone()) —
can't book or reschedule into the past (tightens bug 555 at the
input layer too; the past-slot filter in masterdata service still
handles the hour-granularity)
- clinic-form holiday date picker gets the same — can't observe a
holiday that already passed
Audit complete:
- enquiry-form follow-up date: already had min=today (bug 556 fix)
- appointment-form: fixed here
- clinic-form holidays: fixed here
- my-performance date filter: past valid (reports over history)
- campaign-edit start/end: past valid (historical campaigns)
Admin username + password inputs in the Ozonetel section for supervisor
barge/whisper/listen access. Follows existing masked password pattern.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Setup wizard: 3-pane layout with right-side live previews, resume
banner, edit/copy icons on team step, AI prompt configuration
- Forms: employee-create replaces invite-member (no email invites),
clinic form with address/hours/payment, doctor form with visit slots
- Seed script: aligned to current SDK schema — doctors created as
workspace members (HelixEngage Manager role), visitingHours replaced
by doctorVisitSlot entity, clinics seeded, portalUserId linked
dynamically, SUB/ORIGIN/GQL configurable via env vars
- Pages: clinics + doctors CRUD updated for new schema, team settings
with temp password + role assignment
- New components: time-picker, day-selector, wizard-right-panes,
wizard-layout-context, resume-setup-banner
- Removed: invite-member-form (replaced by employee-create-form per
no-email-invites rule)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replaces the three remaining Pattern B placeholder routes
(/settings/telephony, /settings/ai, /settings/widget) with real forms
backed by the sidecar config endpoints introduced in Phase 1. Each page
loads the current config on mount, round-trips edits via PUT, and
supports reset-to-defaults. Changes take effect immediately since the
TelephonyConfigService / AiConfigService / WidgetConfigService all keep
in-memory caches that all consumers read through.
- src/components/forms/telephony-form.tsx — Ozonetel + SIP + Exotel
sections; honours the '***masked***' sentinel for secrets
- src/components/forms/ai-form.tsx — provider/model/temperature/prompt
with per-provider model suggestions
- src/components/forms/widget-form.tsx — enabled/url/embed toggles plus
an allowedOrigins chip list
- src/pages/telephony-settings.tsx — loads masked config, marks the
telephony wizard step complete when all required Ozonetel fields
are filled
- src/pages/ai-settings.tsx — clamps temperature to 0..2 on save,
marks the ai wizard step complete on successful save
- src/pages/widget-settings.tsx — uses the admin endpoint
(/api/config/widget/admin), exposes rotate-key + copy-to-clipboard
for the site key, and separates the read-only key card from the
editable config card
- src/main.tsx — swaps the three placeholder routes for the real pages
- src/pages/settings-placeholder.tsx — removed; no longer referenced
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replaces Phase 2 placeholder routes for /settings/clinics and
/settings/doctors with real list + add/edit slideouts backed directly by
the platform's ClinicCreateInput / DoctorCreateInput mutations. Rewrites
/settings/team to fetch roles via getRoles and let admins invite members
(sendInvitations) and change roles (updateWorkspaceMemberRole).
- src/components/forms/clinic-form.tsx — reusable form + GraphQL input
transformer, handles address/phone/email composite types
- src/components/forms/doctor-form.tsx — reusable form with clinic
dropdown and currency conversion for consultation fees
- src/components/forms/invite-member-form.tsx — multi-email chip input
with comma-to-commit UX (AriaTextField doesn't expose onKeyDown)
- src/pages/clinics.tsx — list + slideout using ClinicForm, marks the
clinics setup step complete on first successful add
- src/pages/doctors.tsx — list + slideout with parallel clinic fetch,
disabled-state when no clinics exist, marks doctors step complete
- src/pages/team-settings.tsx — replaces email-pattern role inference
with real getRoles + in-row role Select, adds invite slideout, marks
team step complete on successful invitation
- src/main.tsx — routes /settings/clinics and /settings/doctors to real
pages instead of SettingsPlaceholder stubs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>