Skip to content

draft changes#18

Open
pierzchala-m wants to merge 35 commits intomieweb:mainfrom
pierzchala-m:main
Open

draft changes#18
pierzchala-m wants to merge 35 commits intomieweb:mainfrom
pierzchala-m:main

Conversation

@pierzchala-m
Copy link
Copy Markdown

No description provided.

horner and others added 30 commits December 11, 2025 09:01
## New Features

### Embeddable Scheduler Widget (@mieweb/fhir-scheduler)
- React component for browsing provider schedules and booking appointments
- Zustand-based state management with FHIR API client
- Provider list, slot calendar, booking form, and confirmation components
- Standalone Web Component bundle for non-React apps
- Hold countdown timer during checkout to prevent double-booking

### Slot Hold API
- POST /Slot/:id/$hold - Acquire temporary hold on a slot
- GET /Slot/:id/$hold - Check if slot is held
- DELETE /Slot/:id/$hold/:token - Release a hold
- Automatic cleanup of expired holds
- Same-session hold extension support

### Test Infrastructure
- Playwright E2E test scaffolding with 7 test cases
- Auto-start both servers (backend + Vite) during tests

### Data Generation Improvements
- Extended test data from 30 to 180 days (6 months)
- Reduced fill rate from 75% to 50% for more availability
- Random slot shuffling for even distribution across dates

## Files Changed
- New: packages/fhir-scheduler/* (widget package)
- Modified: src/routes/slotRoutes.ts (hold endpoints)
- Modified: src/store/sqliteStore.ts (slot_holds table)
- Modified: src/types/fhir.ts (SlotHold interface)
- Modified: src/examples/generateBusyOffice.ts
- Modified: Embeddable_FHIR_Scheduler.md (updated phases)
- Add screenshots.spec.ts for generating documentation images
- Capture all booking flow steps: provider list, dates, slots, form, confirmation
- Include mobile responsive screenshots
- Update README.md with screenshot gallery
- Add npm run screenshots command for easy regeneration
…pport

- Add visit type selector (new patient vs follow-up flow)
- Add intake questionnaire component for new patients
- Implement browser history integration (back button works)
- Add deep linking with provider ID (#calendar/providerId)
- Add seed data system with date shifting for consistent tests
- Add global-setup.ts for automatic test data import
- Fix TypeScript types in web-component.ts
- Use single Playwright worker to avoid slot hold conflicts
- Update screenshots for new booking flow
Improves UX on mobile/small screens by scrolling the time slots
section into view after a date is selected.
The container wasn't getting deployed correctly. I will do this manually
for now
- Replace esm.sh CDN with unpkg.com for React/ReactDOM (more reliable)
- Inline zustand-like store implementation to avoid CDN dependency
- Use dynamic FHIR_BASE_URL based on hostname (localhost vs production)
- Remove ES module importmap approach that caused CORS blocking
The setState function was comparing the partial state to the current state
before merging, which was incorrect. Now it properly:
1. Computes the partial state from the setter
2. Merges it with the current state to create nextState
3. Then compares nextState with current state

This fixes the issue where providers weren't loading in the demo page.
… shadow DOM

- Update index.html to use standalone.js web component instead of Vite dev server

- Import scheduler.css inline into web-component.ts for shadow DOM styling

- Point /demo route to index.html which has intake questionnaire
- Dockerfile now installs deps and builds fhir-scheduler/dist during image build

- docker-compose.yml only mounts data folder, not entire app (which was overwriting built dist)
… compatibility)

- Add text/plain and x-application/hl7-v2+er7 content type parsers
- Normalize literal \n and \r sequences in HL7 messages
- Return raw HL7 ACK for text requests, JSON-wrapped ACK for JSON requests
- Document ACK codes: AA (accepted), AR (rejected), AE (error)
- Update README.md and src/hl7/README.md with new examples
- Add identifier column to appointments table (with migration for existing DBs)
- Store and retrieve appointment identifiers in SQLite CRUD methods
- Look up existing appointment by placer appointment ID before creating
- Update existing appointment instead of creating duplicates on resend
- Add idx_appointments_identifier index in schema and migration
- Add identifier field to FhirAppointmentQuery interface
- Add identifier WHERE clause in getAppointments SQL query
- Optimize findAppointmentByPlacerId to use indexed store query
  instead of full table scan
- Remove unused appointmentId variable in hl7Routes
- Add AppointmentList component with day/week views, date navigation,
  provider selector, and appointment cards with status badges
- Add provider-view.html and provider-view.tsx entry points
- Add actor query filter to SQLite store getAppointments()
- Add getAppointments() method to fhirClient API
- Add nav links between Book Appointment and Provider View in demo
- Update demo.tsx with tab navigation for AppointmentList
- Export AppointmentList from package index
- Add CSS styles for appointment list UI
- Regenerate seed metadata date
- Add src/auth/basicAuth.ts with timing-safe credential validation
- Register global onRequest hook protecting all non-public routes
- Public (no auth): /health, /, /docs/*, /demo, /scheduler/*
- Auth 401 response respects content type (plain text for HL7, JSON otherwise)
- Add MLLP socket IP allowlist via HL7_MLLP_ALLOWED_IPS env var
- Env vars: AUTH_USERNAME, AUTH_PASSWORD, HL7_MLLP_ALLOWED_IPS
- Auth is optional: if unset, endpoints are open with a startup warning
…Caused issues with the port not getting released.
HL7 SIU messages don't include timezone info, so there's no
reason to store it. All datetimes are now stored as wall-clock
time (e.g. 2026-02-17T08:00:00)  8 AM means 8 AM regardless
of the server or client timezone.

Changes:
- Replace .toISOString() (UTC Z suffix) with toNaiveISO()
  in sqliteStore, HL7 converter, and data generator
- Remove timezone offset format from generateBusyOffice
- Remove Z suffix from fhirClient slot count queries
- Fix appointment date query to use date string comparison
- Regenerate seed metadata with naive format
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants