# 02-Jul-2026 — show all local walks in Local mode, strip HTML on export, drop WM import option [ref #302](https://github.com/nbarrett/ngx-ramblers/issues/302)

## [build 725](https://github.com/nbarrett/ngx-ramblers/actions/runs/28560303316) — [commit 272d90f](https://github.com/nbarrett/ngx-ramblers/commit/272d90fec6ddfb50d978cfa7bae6b275d323a764)

_____

## What's new

Groups using Local Group Walk Population now see their full walks programme again: the list was filtered to manually-created walks only, which hid every Walks-Manager-cached walk and left affected groups' entire forward programme rendering empty. Walks Manager CSV export no longer leaks markup into the exported text, so embedded `<p>/<br>` tags and entities like &amp; come out as plain readable text in both title and description. The walks import page at /walks/admin/import drops the redundant From Walks Manager option, leaving CSV file import as the only (and default) path, and re-uploading a CSV now updates existing walks matched on the Walk ID column instead of appending duplicates. Distance display no longer runs miles and kilometres together as '4.4 mi7.081096 km' when only one distance column is populated, and the CSV import backfills the missing distance column so stored walks always carry both miles and km.

## At a glance

- Groups using Local walk population see their full walks programme again, not just manually-created walks.
- Walks Manager CSV export produces plain readable text — no more literal HTML tags or mangled ampersands.
- The From Walks Manager option is gone from the walks import page; CSV file import is the only path, and re-uploading a CSV updates existing walks instead of creating duplicates.
- Imported walks get their map locations filled in automatically from grid references and postcodes, and the import summary reports how many resolved.
- Joint walk leaders keep their combined name through import and re-import, with the first-listed leader's contact details attached.
- CSV files import every row whatever the line endings or Excel quirks, and walk distances always show both miles and km without running the two together.

## Technical changes

- CSV parsing passes record_delimiter ["\r\n", "\n", "\r"] and bom: true; the same options are applied to the server-side member bulk load and parish CSV imports, so mixed line-ending files behave identically everywhere.
- Import matching resolves an existing walk by groupEvent.id first, then fields.migratedFromId (the Walk ID column).
- Nominatim request, scoring, selection and grid-reference logic is consolidated into one shared server module (net -136 lines); the place-name lookup and the geocode-from-text migration helper are thin wrappers keeping their behavioural differences (user agent, error handling, query guard, return shape) as parameters.
- New GET /api/addresses/geocode-from-text endpoint with Nominatim calls serialized server-side at 1.1s spacing via a module-level promise chain; the import's location enrichment falls back to it for place-name-only descriptions, passing the group's county preference from system config.
- Walk status derives from one shared GroupEventService.statusFor(): the latest status-change event when history exists, otherwise APPROVED for walks-manager-cache and file-import walks, so the status panel, the pill and the publish-status message agree for walks that never went through the local lifecycle.
- Publish-status comparisons normalise both sides through one shared plainTextForUpload() (entity decode, HTML strip, special-character replacement
- the same pipeline the upload uses), so equivalent content stops reporting manufactured differences and genuine differences show the text that would actually upload.
- Publish checkboxes refuse selection for walks with validation problems, with the model as the only state driver (native tick prevented, validation alert shown) and toWalkExport never preselecting an invalid walk; the publish-status message claims only what the parity checks verify and gains a variant acknowledging blocked re-upload.
- The import completion alert lists the actual error messages including the underlying cause (e.g. which walk failed to save and why) instead of just an error count, and the "Imported completed" wording is corrected.
- Walk edit links use the walk's slug (/walks/edit/wyfold) in preference to its database id, matching the public view URL; id-based edit links keep resolving for old bookmarks.