Open
Conversation
## 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.
…w' won't break in deployed version.
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
this will display in the 'Provider view'
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.