Locations

Locations (/admin/locations) stores county and city rows used on projects and estimates. The list is grouped: county parents with nested city rows (not a flat one-row-per-county table).

Permissions: FunctionId COUNTY (32), menu Estimating → Libraries → Locations (function.url = county). View opens the page; Add controls New; Edit and Delete control row actions, bulk status, and bulk delete.

Screen layout

Locations table grouping counties with nested cities

Figure: Grouped County / City / Status grid, Search, Filter (State, District, Map location), Export, New, expand/collapse on county parents.

RegionWhat you see
Page toolbarTitle Locations, subtitle, New (Add), ? help.
Data cardSearch, Filter, Export, grouped columns, checkboxes (real rows only), bulk Mark Active/Inactive and Delete, pagination by county groups.
New modalNew County: — single step, no wizard (County or City type, State, District, Name, Map location, Status).
Edit modalUpdate Location: \{name\} — wizard General · Projects · Estimates (read-only linked tables).
  • County / City / Status — sortable. County parent rows expand to nested City rows (legacy grouped list).
  • Filter — State, District, and Map location (All / No map location / Has map location).
  • Export — Copy, Excel, and CSV of the current page.
  • Checkboxes + bulk bar — Mark as Active, Mark as Inactive, Delete. Rows linked to projects or estimates cannot be removed.
  • New — opens a modal (New County:) without a stepper.
  • Row ⋮ — Edit (modal wizard) · Activate or Deactivate · Delete.

New location

Start with Location type (County or City), then State, District, Name (or County parent + city name), Map location, and Status. District is required. For City, the County list loads from counties in the selected District and/or State (either filter is enough).

Map location uses Google Places search (US) plus latitude/longitude and Clear. Places needs the same Maps key as Symfony (GOOGLE_MAPS_API_KEY / NEXT_PUBLIC_GOOGLE_MAPS_API_KEY in local env — never committed).

Edit wizard

Edit opens a modal on the list. Title: Update Location: {name}. Steps in the stepper only — General, Projects, Estimates — with no extra heading under the pills.

Edit location wizard Projects step with Search, Export, sortable columns, and pagination

Figure: Edit Location — Projects DataTable (Search, Export, sort, pagination). Estimates uses the same chrome.

  • General — same fields as New (Location type, State, District, Name, Map location, Status).
  • Projects — linked projects, read-only. Columns: C & G Project #, County, Name, Description, Due Date, Company, Status, Notes, Actions. Search, Export (Copy / Excel / CSV), sortable headers, rows-per-page. Actions is a single eye button (View), not a ⋮ menu — opens the project when that screen exists.
  • Estimates — linked estimates, read-only. Columns: Name, Project ID, Stage, Status, Bid deadline, Actions. Same Search / Export / sort / pagination chrome; same eye View button.