Skip to content

Admin Venues section: what to review โ€‹

FieldValue
Branchfeat/admin-and-merchant-portals, draft PR #976: feat(admin): portal navigation, financials and monitoring, plus the agent-process work behind them, not merged
ProjectREADME.md
Issue#985: feat(admin/venues): Venues becomes a real section with sub nav, drawer editing, metrics and filters
Servers you needAdmin portal on http://localhost:3001 (npm run admin:dev). Admin Storybook on http://localhost:6008 (npm run storybook:admin)
Local originsRequired for the Activity tab and for venue create and edit. See the warning below
Test plandocs/engineering/testing/runs/admin-venues-section/README.md, filled from a live pass

Why do some of these rows say "needs the local origins"? โ€‹

The admin portal proxies /api/venues and /api/analytics to the DEPLOYED Cloud Run services, so branch backend changes are invisible on your machine. โ€‹

What changed here? โ€‹

Venues stopped being one page and became a section, modelled on Users. โ€‹

  • Your own words on 2026-08-28: each venue should be clickable rather than having an Edit button, the list should carry four core metrics at the top, and filtering should work the way Users does.
  • Four tabs: List, Activity, Create venue, Configuration. Each tab is its own route, so a tab survives a reload and a bookmark.

A row click opens a drawer. The Edit button is gone. โ€‹

  • Editing no longer navigates away from the list.

Two surfaces MOVED into the section, both with redirects rather than deletions. โ€‹

  • Venue Activity came from /admin/analytics/dashboards/venue-activity. Analytics keeps a cross-link at the end of its dashboard strip.
  • The four venue configuration pages came from /admin/config/venues/*. Each old sub-page redirects to its own new one, so a bookmark lands where it was pointing rather than on Tiers.
  • The Settings nav entry for venue configuration is gone.

Two labels were renamed on your call, both cases of an agent's framing leaking into a label. โ€‹

  • "Supply" became Venues. A "hangout venues" count under a Category mix heading became the number of categories present.

The venue form learned address confirmation, merchant claim, and long names that fit. โ€‹

Where do I look, and what am I looking for? โ€‹

The section shell and its tab strip http://localhost:3001/admin/venues โ€‹

  • It should redirect to /admin/venues/list rather than sitting on a bare index.
  • Four tabs across the top: List, Activity, Create venue, Configuration. Configuration should expose its own four sub-pages.
  • Reload on any tab and you should stay on that tab.

The List tab http://localhost:3001/admin/venues/list โ€‹

  • A four-up metric strip: Venues, Live now, Needs attention, Category mix.
  • Three of the four filter the table. Category mix does not, because a mix is not a subset of the list, so it is a div rather than a button and stays out of the tab order. Tab through the strip and confirm Category mix is skipped.
  • The first card must read "Venues", not "Supply". The Category mix headline must count categories, not venues.
  • The toolbar should be a row, Users-style, with filters.
  • Clicking a row opens a drawer. There should be no Edit button anywhere in the table.
  • Known open finding, and you will see it: the list streams a capped Firestore page of 200, and the strip renders that cap as the venue total. With 640 venues the strip reads "Venues 200", the live share divides by the wrong denominator, and "Needs attention" only counts defects inside the first 200 names alphabetically. The cap is not new; stating it as a total is.

The Activity tab http://localhost:3001/admin/venues/activity โ€‹

  • Needs the local origins. Period stats come from BigQuery analytics.events through analytics-api.
  • It should render inside the Venues section chrome, not as a standalone page with its own header.
  • The old path /admin/analytics/dashboards/venue-activity should redirect here.

Create venue http://localhost:3001/admin/venues/new โ€‹

  • Needs the local origins to exercise the save.
  • Address confirmation, merchant claim, and a long venue name that fits rather than overflowing.

Configuration http://localhost:3001/admin/venues/config/tiers โ€‹

Storybook http://localhost:6008 โ€‹

What is deliberately NOT done? โ€‹

Analytics > Dashboards is now three placeholder routes and nothing else. โ€‹

No launch plan row was invented. โ€‹

  • No row in ALPHA.md covers admin venue management, and inventing one is not this project's call.

The category clamp found by the live browser pass. โ€‹

  • Found during the live pass and recorded in the test plan rather than left silent.

What open findings touch this project? โ€‹

Cross-referenced from ../merchant-and-venue-dashboards/branch-review-0828.md. Both of these are in the review's top tier, and both are things you will hit while reviewing.

A capped Firestore page is rendered as the venue total. VenueMetricStrip.jsx:49 โ€‹

  • The list streams limit(200), venueMetrics.js sets total = venues.length, and the live share divides by it.
  • An admin who works the Needs-attention queue to zero is told the platform is clean while 440 venues were never examined.
  • This is the third instance of the same class in two days, after the two Dashboard rail counts and the merchant Overview counter. Worth treating as a pattern rather than three bugs.

Clearing an address marks it as human-confirmed. VenueForm.jsx:236 โ€‹

  • The field's onChange sets addressConfirmed to true on any change. That is true for typing and false for deleting, and the field's own hint invites the deletion: "Leave blank to auto-fill from the coordinates."
  • On save an empty address is dropped from the payload while addressConfirmed: true is still sent, and the update path does not reverse-geocode. So the venue keeps its unverified geocoder guess, the "Approximate" badge disappears, and it leaves the Needs-attention count.
  • There is a server-side half. venue.service.js:319 invalidates addressConfirmed when the pin moves and no address is sent, but the form always sends an explicit value, so correcting only the coordinates of a Confirmed venue keeps it confirmed for a location nobody vouched for. The two halves want fixing together.

What issue does each piece close? โ€‹

PieceIssueState
The section, sub nav, drawer, metrics and filters#985: feat(admin/venues): Venues becomes a real section with sub nav, drawer editing, metrics and filtersBuilt on branch
The three Dashboards routes left behind by the move#999: feat(admin/analytics): the three Dashboards routes have been placeholders for 123 days, and one of them has no data sourceOpen, needs your decision
Local origins for the Activity tab and venue saves#1002: fix(dev-env): local dev proxies venues and analytics to Cloud Run, so branch backend changes are invisible locallyOpen, another lane

Built with VitePress