{"id":"6a3069c4454e4cfeddd0a554","title":"2026 06 15","path":"how-to/committee/release-notes/2026-06-15","contentMarkdown":"# 15-Jun-2026 — index map navigation, back-nav caching, loading placeholder, and search result meta [#203](https://github.com/nbarrett/ngx-ramblers/issues/203)\n\n## [build 697](https://github.com/nbarrett/ngx-ramblers/actions/runs/27575612544) — [commit d97773f](https://github.com/nbarrett/ngx-ramblers/commit/d97773f6467fd870b36dd461f230da9d9fc5444b)\n\n_____\n\n## What's new\n\nImprovements to the route maps and site search\n(https://github.com/nbarrett/ngx-ramblers/issues/203):\n\n- Map pins on the route index pages are clickable again and take you to the route.\n- Returning to a map page is instant, instead of rebuilding each time.\n- Maps show a tidy loading spinner while they prepare, rather than briefly\nshowing the wrong location first.\n- Search results show the date and the walk leader or event coordinator, and you\ncan search by a leader's name.\n\n## At a glance\n\n- Clicking a pin on any route or content index page that shows a map opens the page represented by that pin.\n- Press Back from a route and the map page reappears immediately, already centred\nwhere it was.\n- While a map loads you see a \"Loading map...\" spinner in the map area; the map\nthen appears centred on the right place.\n- Each search result shows its date and, for walks and events, the leader or\ncoordinator's name.\n- Typing a leader's name into search finds their walks and events, most recent first.\n\n## Where to find it\n\n- Route maps: any route or content index page that is configured to show a map.\n- Search: the magnifying glass in the header, and the full /search page.\n\n## How it behaves\n\n- Pins: clicking a pin opens that route; hovering shows its name.\n- Back navigation: the page and its map view are remembered for the session, so\nreturning is instant with no reload or rebuild. If you are logged in and turn on\n\"edit site\", pages always load fresh so your edits are never served from the\nremembered copy, and saving a page refreshes it for everyone.\n- Loading: the map area shows a spinner until the data is ready, then the map\nappears already framed on the routes. It no longer briefly shows a default location.\n- Search meta: results list the date and, for walks and events, the leader or\ncoordinator beneath the title; the same coordinator line now also appears on\nevent cards. Recent walks and events are listed first; pages keep their relevance order.\n\n## How to try it out\n\n1. Open any route or content index page that shows a map and click any pin: it opens the page represented by that pin.\n2. Press Back: the map page returns instantly, centred as before.\n3. Refresh the page: you see a brief \"Loading map...\" spinner, then the map framed\non the routes, with no wrong-location flash.\n4. Search a walk leader's name from the header: their walks and events appear,\nnewest first, each showing its date and the leader or coordinator.\n\n## Technical changes\n\nIndex map (DynamicContentViewIndex / DynamicContentViewIndexMap):\n- filteredPageContent() is memoised so it returns a stable reference unless\nsearchText or the source content changes. Previously it built a fresh object\nevery change-detection cycle, so the map's ngOnChanges rebuilt every Leaflet\nmarker each cycle; a real pin click then destroyed the icon between mousedown and\nmouseup and the browser never fired a click.\n- New MapViewCacheService stores the map's settled centre/zoom keyed by marker set\n+ provider + style + height. The fit now runs at mount, before the moveend\nlistener attaches, so the view is captured explicitly once the map is ready and a\nreturn renders straight at the fitted view with no refit.\n- While marker data loads the component shows an opaque placeholder card with a\nFontAwesome spinner instead of mounting Leaflet (Bootstrap spinner-border does\nnot render in this build); the map mounts only once data is ready, pre-centred on\nthe markers, so the default centre is never shown. The shared loading overlay was\nextracted into a MapLoadingOverlay component.\n\nContent caching (ContentCacheService):\n- Caches findByPath results and the computed album index (several server queries)\nfor the session. Bypassed only while site edit mode is active\n(SiteEditService.active()), and cleared on any page-content create/update/delete.\n\nSearch (server site-search controller, SiteSearchService, search components):\n- Event entries index fields.contactDetails.displayName into the haystack and\nreturn it as contactName; the popup and /search page render the date and the\nleader/coordinator on the meta line. groupResults orders walk and event groups\nmost-recent-first by start date, undated last; group-event-card shows the\ncoordinator line.","contentHtml":"<h1>15-Jun-2026 — index map navigation, back-nav caching, loading placeholder, and search result meta <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/203\">#203</a></h1>\n<h2><a href=\"https://github.com/nbarrett/ngx-ramblers/actions/runs/27575612544\">build 697</a> — <a href=\"https://github.com/nbarrett/ngx-ramblers/commit/d97773f6467fd870b36dd461f230da9d9fc5444b\">commit d97773f</a></h2>\n<hr>\n<h2>What&#39;s new</h2>\n<p>Improvements to the route maps and site search\n(<a href=\"https://github.com/nbarrett/ngx-ramblers/issues/203\">https://github.com/nbarrett/ngx-ramblers/issues/203</a>):</p>\n<ul>\n<li>Map pins on the route index pages are clickable again and take you to the route.</li>\n<li>Returning to a map page is instant, instead of rebuilding each time.</li>\n<li>Maps show a tidy loading spinner while they prepare, rather than briefly\nshowing the wrong location first.</li>\n<li>Search results show the date and the walk leader or event coordinator, and you\ncan search by a leader&#39;s name.</li>\n</ul>\n<h2>At a glance</h2>\n<ul>\n<li>Clicking a pin on any route or content index page that shows a map opens the page represented by that pin.</li>\n<li>Press Back from a route and the map page reappears immediately, already centred\nwhere it was.</li>\n<li>While a map loads you see a &quot;Loading map...&quot; spinner in the map area; the map\nthen appears centred on the right place.</li>\n<li>Each search result shows its date and, for walks and events, the leader or\ncoordinator&#39;s name.</li>\n<li>Typing a leader&#39;s name into search finds their walks and events, most recent first.</li>\n</ul>\n<h2>Where to find it</h2>\n<ul>\n<li>Route maps: any route or content index page that is configured to show a map.</li>\n<li>Search: the magnifying glass in the header, and the full /search page.</li>\n</ul>\n<h2>How it behaves</h2>\n<ul>\n<li>Pins: clicking a pin opens that route; hovering shows its name.</li>\n<li>Back navigation: the page and its map view are remembered for the session, so\nreturning is instant with no reload or rebuild. If you are logged in and turn on\n&quot;edit site&quot;, pages always load fresh so your edits are never served from the\nremembered copy, and saving a page refreshes it for everyone.</li>\n<li>Loading: the map area shows a spinner until the data is ready, then the map\nappears already framed on the routes. It no longer briefly shows a default location.</li>\n<li>Search meta: results list the date and, for walks and events, the leader or\ncoordinator beneath the title; the same coordinator line now also appears on\nevent cards. Recent walks and events are listed first; pages keep their relevance order.</li>\n</ul>\n<h2>How to try it out</h2>\n<ol>\n<li>Open any route or content index page that shows a map and click any pin: it opens the page represented by that pin.</li>\n<li>Press Back: the map page returns instantly, centred as before.</li>\n<li>Refresh the page: you see a brief &quot;Loading map...&quot; spinner, then the map framed\non the routes, with no wrong-location flash.</li>\n<li>Search a walk leader&#39;s name from the header: their walks and events appear,\nnewest first, each showing its date and the leader or coordinator.</li>\n</ol>\n<h2>Technical changes</h2>\n<p>Index map (DynamicContentViewIndex / DynamicContentViewIndexMap):</p>\n<ul>\n<li>filteredPageContent() is memoised so it returns a stable reference unless\nsearchText or the source content changes. Previously it built a fresh object\nevery change-detection cycle, so the map&#39;s ngOnChanges rebuilt every Leaflet\nmarker each cycle; a real pin click then destroyed the icon between mousedown and\nmouseup and the browser never fired a click.</li>\n<li>New MapViewCacheService stores the map&#39;s settled centre/zoom keyed by marker set</li>\n</ul>\n<ul>\n<li>provider + style + height. The fit now runs at mount, before the moveend\nlistener attaches, so the view is captured explicitly once the map is ready and a\nreturn renders straight at the fitted view with no refit.</li>\n</ul>\n<ul>\n<li>While marker data loads the component shows an opaque placeholder card with a\nFontAwesome spinner instead of mounting Leaflet (Bootstrap spinner-border does\nnot render in this build); the map mounts only once data is ready, pre-centred on\nthe markers, so the default centre is never shown. The shared loading overlay was\nextracted into a MapLoadingOverlay component.</li>\n</ul>\n<p>Content caching (ContentCacheService):</p>\n<ul>\n<li>Caches findByPath results and the computed album index (several server queries)\nfor the session. Bypassed only while site edit mode is active\n(SiteEditService.active()), and cleared on any page-content create/update/delete.</li>\n</ul>\n<p>Search (server site-search controller, SiteSearchService, search components):</p>\n<ul>\n<li>Event entries index fields.contactDetails.displayName into the haystack and\nreturn it as contactName; the popup and /search page render the date and the\nleader/coordinator on the meta line. groupResults orders walk and event groups\nmost-recent-first by start date, undated last; group-event-card shows the\ncoordinator line.</li>\n</ul>\n"}