Skip to content

Event setup refactor: loading state, tab consistency, multi-clinic foundation, CSV bulk import - #18

Merged
evanqua merged 6 commits into
mainfrom
feature/event-setup-refactor
Aug 11, 2026
Merged

Event setup refactor: loading state, tab consistency, multi-clinic foundation, CSV bulk import#18
evanqua merged 6 commits into
mainfrom
feature/event-setup-refactor

Conversation

@evanqua

@evanqua evanqua commented Aug 11, 2026

Copy link
Copy Markdown
Owner

Summary

  • Loading feedback on "Start New Event" (isLoading/isDisabled on the trigger button while the draft event write is in flight).
  • Fixed the Teams/Supervisors/Posts/Equipment tab blurred-panel boundary mismatch by switching to real flexbox fill instead of a duplicated viewport-relative magic number.
  • Matched lite mode's staffing-panel blur to cloud mode's, and gave cloud's Add Team/Add Supervisor actions visible labels.
  • Laid the data-model and venue/dispatch foundation for multiple named clinics (Event.clinics, Post.isClinic, Call.clinicId, one dispatch tab per clinic) — the "which clinic does this call go to" picker UI is intentionally deferred as a follow-up.
  • Added CSV bulk upload for teams and supervisors (template download + validated preview import) via a split Add button next to the existing single-entry flow.
  • Unified event-create visual language between lite and cloud modes (list-item cards, chip tokens, button colors, header spacing, panel bottom padding) and documented the pattern as a scoped Claude Code skill for event/venue creation surfaces.

Test plan

  • npm run type-check
  • npm run lint (no new warnings introduced)
  • Manual verification in a running dev server (not done via browser automation this session, per user instruction)
  • No existing Playwright coverage for clinic-tab creation or CSV import — consider adding .feature coverage as a follow-up

🤖 Generated with Claude Code

Both Start New Event buttons fired an async Firestore write with zero
visual feedback, so slow writes or double-clicks had no indication.
Every tab pinned its ScrollShadow to a fixed calc(100vh - 334px) height,
but only Posts had its section header scrolling inside that box - the
other three pinned their header outside it, so their rigid, non-shrinking
box overflowed the shared blurred Card by the header's height and got
clipped, leaving a visible grey gap other tabs didn't have. Replace the
viewport-relative magic number everywhere with real flexbox fill
(flex-1 min-h-0) so every tab's content fills exactly the space its
header leaves behind, landing at the same boundary regardless of tab.
…sor buttons

Lite mode's staffing panel used a Tailwind opacity utility
(bg-surface-deeper/90), which HeroUI's isBlurred classes can dilute at
equal specificity, giving a washed-out look next to cloud mode's forced
inline rgba background. Force the same value via inline style.

Cloud mode's add-team/add-supervisor buttons were icon-only where lite
mode's already carry text - add visible "Add Team" / "Add" labels to
match.
Venues can now designate placed locations as clinics (PendingMarkerDialog
for new markers, LocationEditModal for existing ones), events carry a
Event.clinics[] list, and the dispatch page renders one named tab per
clinic instead of a single hardcoded "Clinic" tab. Calls carry a
clinicId, defaulting new/updated deliveries to the first clinic so
nothing is duplicated or hidden across tabs.

Events with no clinics[] set fall back to a single default clinic with
id 'clinic', so existing single-clinic events are visually and
behaviorally unchanged.

Deliberately out of scope: UI for picking which specific clinic a call
gets routed to when it's created/delivered - deliveries currently all
default to the first clinic. That's a follow-up once the routing UX is
decided.
Adds a split-button beside the existing Add Team/Add Supervisor buttons
(dropdown "Upload CSV" option) opening a new BulkImportModal styled to
match the existing add-team/add-supervisor modals. It offers a
downloadable template CSV, parses an uploaded file client-side with
papaparse, previews parsed rows with per-row validation (missing
fields, unknown certification, duplicate team/call sign name), and
appends only the valid rows into the same local eventData.staff /
eventData.supervisor arrays the existing single-entry modals use - no
new backend calls, since staff/supervisor records only persist on the
page's existing save action.
Bring cloud's create page in line with lite mode's blurred-panel design
system: shared bg-surface-deeper/90 list-item cards, bg-accent/20 chip
tokens instead of hardcoded hex, bg-zinc-700 add-buttons, consistent
header padding/border across Teams/Supervisors/Posts/Equipment tabs,
and matching bottom panel spacing so content no longer touches the
viewport edge. Documented the pattern as a scoped Claude Code skill
(event-venue-creation-design) for event/venue creation surfaces only.
@evanqua
evanqua requested a review from iv-zhang as a code owner August 11, 2026 23:21
@evanqua
evanqua deployed to Development August 11, 2026 23:21 — with GitHub Actions Active
@evanqua evanqua added the enhancement New feature or request label Aug 11, 2026
@evanqua
evanqua merged commit e54a6f6 into main Aug 11, 2026
5 checks passed
@evanqua
evanqua deleted the feature/event-setup-refactor branch August 12, 2026 05:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant