Skip to content

feat(admin): surface member address fields on detail page #1973

@cdcore09

Description

@cdcore09

Summary

The admin member detail page's Identity tab does not currently expose city, region, countryId, publicLocation, showOnMap, or the geocoded latitude/longitude. Staff editing a member can't fix a typo'd city or toggle map visibility without going to the public dossier.

Requirements

  • MemberDetailPage.tsx Identity tab gains an Address section with editable fields:
    • City (text)
    • Region / state (text)
    • Country (vocab picker reusing the existing countries vocab endpoint)
    • Public location string (free-form override shown on the public dossier byline)
    • showOnMap toggle
  • Read-only preview of the geocoded result ("Pin: 42.36°N, 71.06°W") with a "Re-geocode now" button that bypasses the normal change-detection trigger
  • PATCH /admin/users/:id body schema extended (packages/api/src/routes/admin/users/byId.ts) to accept city, region, countryId, publicLocation, showOnMap
  • GET /admin/users/:id response includes the existing address fields and geocoded_at so the UI can render the timestamp
  • Soft-delete / restore controls left untouched

Context

profiles has city, region, countryId, publicLocation, latitude, longitude, showOnMap already (packages/api/src/db/schema/users.ts:103-117). The admin PATCH route just doesn't accept them yet; the detail page just doesn't display them yet.

Depends on #1972 for the geocoded-value population and geocoded_at column.

Implementation Notes

Country picker: the vocab endpoint at packages/api/src/routes/vocab.ts already exposes countries; the web account page uses the same dataset for its country picker (see apps/web/src/hooks/useVocab.ts). Reuse it to avoid a parallel vocab fetch.

showOnMap defaults to false per the schema — admins flipping it on is an explicit consent decision and should be paired with a small note like "Surfaces this member on the public community map at /map."

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions