Admin Venues section: what to review โ
| Field | Value |
|---|---|
| Branch | feat/admin-and-merchant-portals, draft PR #976: feat(admin): portal navigation, financials and monitoring, plus the agent-process work behind them, not merged |
| Project | README.md |
| Issue | #985: feat(admin/venues): Venues becomes a real section with sub nav, drawer editing, metrics and filters |
| Servers you need | Admin portal on http://localhost:3001 (npm run admin:dev). Admin Storybook on http://localhost:6008 (npm run storybook:admin) |
| Local origins | Required for the Activity tab and for venue create and edit. See the warning below |
| Test plan | docs/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. โ
- The venue list itself streams Firestore directly from the browser, so the list, the metric strip and the filters render fine against the deployed origins.
- Venue create and edit go through venues-api, and the Activity tab reads analytics-api. Those two need the local origins to show this branch.
- Restart the admin dev server after the
.env.localorigin change lands. - Tracked as
#1002: fix(dev-env): local dev proxies venues and analytics to Cloud Run, so branch backend changes are invisible locally.
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/listrather 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.eventsthrough 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-activityshould 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 โ
- Four sub-pages: Tiers, Import Defaults, Refresh Thresholds, Overpass API.
- Each old path should redirect to its matching new one. Check at least one:
/admin/config/venues/overpassshould land on Overpass API, not on Tiers. - Switching sub-pages should not lose form state, because the component is mounted at every sub-page route rather than switched inside one.
Storybook http://localhost:6008 โ
- Section, List tab, and its Activity, Create and Configuration tabs.
- Metric strip, plus Needs attention selected, Empty project, Nothing lit, Long values.
- Detail drawer, open, plus Approximate address and Long name.
- List toolbar, plus Sparse and Empty project.
- Static captures of all of these are in
screenshots/; live signed-in captures are inscreenshots/live/.
What is deliberately NOT done? โ
Analytics > Dashboards is now three placeholder routes and nothing else. โ
- With Venue Activity gone to Venues and Ad Delivery gone to Ad Network, that is what is left. It was left clean rather than half-fixed: old paths redirect, nothing dangles. It needs your decision.
- Tracked as
#999: feat(admin/analytics): the three Dashboards routes have been placeholders for 123 days, and one of them has no data source.
No launch plan row was invented. โ
- No row in
ALPHA.mdcovers 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.jssetstotal = 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
onChangesetsaddressConfirmedtotrueon 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: trueis 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:319invalidatesaddressConfirmedwhen 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? โ
| Piece | Issue | State |
|---|---|---|
| The section, sub nav, drawer, metrics and filters | #985: feat(admin/venues): Venues becomes a real section with sub nav, drawer editing, metrics and filters | Built 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 source | Open, 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 locally | Open, another lane |