Event setup refactor: loading state, tab consistency, multi-clinic foundation, CSV bulk import - #18
Merged
Merged
Conversation
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.
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.
Summary
isLoading/isDisabledon the trigger button while the draft event write is in flight).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.Test plan
npm run type-checknpm run lint(no new warnings introduced).featurecoverage as a follow-up🤖 Generated with Claude Code