{"id":"695823bf51eccfbd24748224","title":"2025 12 04","path":"how-to/committee/release-notes/2025-12-04","contentMarkdown":"# 04-Dec-2025 — content: Location input enhancement and Map row type with GPX support [#97](https://github.com/nbarrett/ngx-ramblers/issues/97)\n\n## [Commit 8ba0f50](https://github.com/nbarrett/ngx-ramblers/commit/8ba0f5051b92c5e0a5ade1bdbfec749b31115daa)\n\n_____\n\nPhase 5: Location Input Enhancement\n- Add place name search with server-side lookup service\n- Create location-links component for Google Maps integration\n- Improve reverse geocoding with error handling\n- Enhance walk-location-edit with comprehensive location input UI\n- Add location row editors with improved UX\nPhase 6: Map Row Type with GPX Support\n- Parse GPX track points, waypoints, elevation, and distance data\n- Calculate route metrics and bounds automatically\n- Support multiple GPX routes with individual color/opacity styling\n- Display route waypoints with toggle controls\n- Show route legend with color-coded route names\n- Calculate route statistics (distance, ascent, descent, elevation)\n- Add MapOverlayConfig with provider, style, clustering, opacity controls\n- Support real-time opacity/clustering/style adjustments\n- Implement route style palette (color/opacity per route)\n- Support dynamic GPX file loading from AWS/server paths\n- Integrate with walk-edit components for route visualization\nPerformance & Search Improvements:\n- Optimize Index map with batch API queries for walk locations (50x faster)\n- Add full-width search input with URL synchronization\n- Sync search state to URL query parameters for shareable links\n- URL takes precedence over localStorage for search initialization\n- Filter both action buttons and map markers based on search\nMap Controls Enhancements:\n- Add showControlsDefault and allowControlsToggle settings\n- Add showWaypointControls input to MapOverlayControls\n- Hide waypoint controls for Index maps (only relevant for GPX routes)\n- Fix map preview not responding to provider/osStyle changes\n- Add ngOnChanges handlers for all map config properties\n- Refactor map component files: rename *.component.ts to *.ts\n- Add /test-data/ to .gitignore\n\nUpdated row type selector:\n- Added displayValue() method to customize enum display\n- Maps ALBUM_INDEX to \"Index\" for cleaner UI\n- Keeps internal enum value unchanged for backward compatibility\nEnhanced album index view with search filtering:\n- Added search input with FontAwesome search icon\n- Only shows search when >5 items (shouldShowSearch)\n- filteredPageContent() filters columns by title and contentText\n- Search applies to both action buttons and map rendering\n- Case-insensitive substring matching\nAll phases complete for issue #97:\n- Phase 1: Location row type for dynamic content\n- Phase 2: Index multi-content support (albums + pages)\n- Phase 3: Map rendering with clustering\n- Phase 4: Search filtering and UI polish\n\nCreated DynamicContentViewAlbumIndexMapComponent:\n- Leaflet-based map with marker clustering support\n- Configurable map height, clustering threshold\n- Click-to-navigate markers with rich popups\n- Image thumbnails, titles, descriptions in popups\n- Auto-fit bounds to show all markers\nUpdated content-text.model:\n- Added location property to PageContentColumn interface\n- Enables location data passthrough from pages to map\nEnhanced LocationExtractionService:\n- Now includes location coordinates in extracted columns\n- Supports geocoded data for map rendering\nUpdated album index view component:\n- Multi-render mode support (action buttons + map)\n- Renders modes in selection order\n- Passes map configuration from albumIndex to map component\n- getRenderModes() defaults to ACTION_BUTTONS for backward compatibility\nAdded map configuration UI to album index editor:\n- Render modes multi-select (action buttons, map)\n- Conditional map config section (height, clustering toggle, threshold)\n- ensureMapConfig() initializes defaults when MAP mode selected\n- Defaults: height 500px, clustering enabled, threshold 10 items\n\nExtended AlbumIndexService to support multiple content types:\n- Added contentTypes property to AlbumIndex interface\n- Defaults to [IndexContentType.ALBUMS] for backward compatibility\n- Refactored album extraction into extractAlbumColumns method\n- Integrated LocationExtractionService for PAGES content type\n- Aggregates albums and pages based on contentTypes selection\nUpdated album index edit UI:\n- Added ng-select multi-select for content type selection\n- Selection order determines display order\n- Initialization ensures backward compatibility\n- Changed summary text from \"albums\" to \"items\" for generic display\nFixed Location edit component:\n- Corrected AlertTarget import from alert-target.model\n- Properly initialized notify instance in ngOnInit\n- Added notification target template reference\n\nAdd new Location row type to capture and display location data within dynamic content pages.","contentHtml":"<h1>04-Dec-2025 — content: Location input enhancement and Map row type with GPX support <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/97\">#97</a></h1>\n<h2><a href=\"https://github.com/nbarrett/ngx-ramblers/commit/8ba0f5051b92c5e0a5ade1bdbfec749b31115daa\">Commit 8ba0f50</a></h2>\n<hr>\n<p>Phase 5: Location Input Enhancement</p>\n<ul>\n<li>Add place name search with server-side lookup service</li>\n<li>Create location-links component for Google Maps integration</li>\n<li>Improve reverse geocoding with error handling</li>\n<li>Enhance walk-location-edit with comprehensive location input UI</li>\n<li>Add location row editors with improved UX\nPhase 6: Map Row Type with GPX Support</li>\n<li>Parse GPX track points, waypoints, elevation, and distance data</li>\n<li>Calculate route metrics and bounds automatically</li>\n<li>Support multiple GPX routes with individual color/opacity styling</li>\n<li>Display route waypoints with toggle controls</li>\n<li>Show route legend with color-coded route names</li>\n<li>Calculate route statistics (distance, ascent, descent, elevation)</li>\n<li>Add MapOverlayConfig with provider, style, clustering, opacity controls</li>\n<li>Support real-time opacity/clustering/style adjustments</li>\n<li>Implement route style palette (color/opacity per route)</li>\n<li>Support dynamic GPX file loading from AWS/server paths</li>\n<li>Integrate with walk-edit components for route visualization\nPerformance &amp; Search Improvements:</li>\n<li>Optimize Index map with batch API queries for walk locations (50x faster)</li>\n<li>Add full-width search input with URL synchronization</li>\n<li>Sync search state to URL query parameters for shareable links</li>\n<li>URL takes precedence over localStorage for search initialization</li>\n<li>Filter both action buttons and map markers based on search\nMap Controls Enhancements:</li>\n<li>Add showControlsDefault and allowControlsToggle settings</li>\n<li>Add showWaypointControls input to MapOverlayControls</li>\n<li>Hide waypoint controls for Index maps (only relevant for GPX routes)</li>\n<li>Fix map preview not responding to provider/osStyle changes</li>\n<li>Add ngOnChanges handlers for all map config properties</li>\n<li>Refactor map component files: rename *.component.ts to *.ts</li>\n<li>Add /test-data/ to .gitignore</li>\n</ul>\n<p>Updated row type selector:</p>\n<ul>\n<li>Added displayValue() method to customize enum display</li>\n<li>Maps ALBUM_INDEX to &quot;Index&quot; for cleaner UI</li>\n<li>Keeps internal enum value unchanged for backward compatibility\nEnhanced album index view with search filtering:</li>\n<li>Added search input with FontAwesome search icon</li>\n<li>Only shows search when &gt;5 items (shouldShowSearch)</li>\n<li>filteredPageContent() filters columns by title and contentText</li>\n<li>Search applies to both action buttons and map rendering</li>\n<li>Case-insensitive substring matching\nAll phases complete for issue #97:</li>\n<li>Phase 1: Location row type for dynamic content</li>\n<li>Phase 2: Index multi-content support (albums + pages)</li>\n<li>Phase 3: Map rendering with clustering</li>\n<li>Phase 4: Search filtering and UI polish</li>\n</ul>\n<p>Created DynamicContentViewAlbumIndexMapComponent:</p>\n<ul>\n<li>Leaflet-based map with marker clustering support</li>\n<li>Configurable map height, clustering threshold</li>\n<li>Click-to-navigate markers with rich popups</li>\n<li>Image thumbnails, titles, descriptions in popups</li>\n<li>Auto-fit bounds to show all markers\nUpdated content-text.model:</li>\n<li>Added location property to PageContentColumn interface</li>\n<li>Enables location data passthrough from pages to map\nEnhanced LocationExtractionService:</li>\n<li>Now includes location coordinates in extracted columns</li>\n<li>Supports geocoded data for map rendering\nUpdated album index view component:</li>\n<li>Multi-render mode support (action buttons + map)</li>\n<li>Renders modes in selection order</li>\n<li>Passes map configuration from albumIndex to map component</li>\n<li>getRenderModes() defaults to ACTION_BUTTONS for backward compatibility\nAdded map configuration UI to album index editor:</li>\n<li>Render modes multi-select (action buttons, map)</li>\n<li>Conditional map config section (height, clustering toggle, threshold)</li>\n<li>ensureMapConfig() initializes defaults when MAP mode selected</li>\n<li>Defaults: height 500px, clustering enabled, threshold 10 items</li>\n</ul>\n<p>Extended AlbumIndexService to support multiple content types:</p>\n<ul>\n<li>Added contentTypes property to AlbumIndex interface</li>\n<li>Defaults to [IndexContentType.ALBUMS] for backward compatibility</li>\n<li>Refactored album extraction into extractAlbumColumns method</li>\n<li>Integrated LocationExtractionService for PAGES content type</li>\n<li>Aggregates albums and pages based on contentTypes selection\nUpdated album index edit UI:</li>\n<li>Added ng-select multi-select for content type selection</li>\n<li>Selection order determines display order</li>\n<li>Initialization ensures backward compatibility</li>\n<li>Changed summary text from &quot;albums&quot; to &quot;items&quot; for generic display\nFixed Location edit component:</li>\n<li>Corrected AlertTarget import from alert-target.model</li>\n<li>Properly initialized notify instance in ngOnInit</li>\n<li>Added notification target template reference</li>\n</ul>\n<p>Add new Location row type to capture and display location data within dynamic content pages.</p>\n"}