# 04-Dec-2025 — content: Location input enhancement and Map row type with GPX support [#97](https://github.com/nbarrett/ngx-ramblers/issues/97)

## [Commit 8ba0f50](https://github.com/nbarrett/ngx-ramblers/commit/8ba0f5051b92c5e0a5ade1bdbfec749b31115daa)

_____

Phase 5: Location Input Enhancement
- Add place name search with server-side lookup service
- Create location-links component for Google Maps integration
- Improve reverse geocoding with error handling
- Enhance walk-location-edit with comprehensive location input UI
- Add location row editors with improved UX
Phase 6: Map Row Type with GPX Support
- Parse GPX track points, waypoints, elevation, and distance data
- Calculate route metrics and bounds automatically
- Support multiple GPX routes with individual color/opacity styling
- Display route waypoints with toggle controls
- Show route legend with color-coded route names
- Calculate route statistics (distance, ascent, descent, elevation)
- Add MapOverlayConfig with provider, style, clustering, opacity controls
- Support real-time opacity/clustering/style adjustments
- Implement route style palette (color/opacity per route)
- Support dynamic GPX file loading from AWS/server paths
- Integrate with walk-edit components for route visualization
Performance & Search Improvements:
- Optimize Index map with batch API queries for walk locations (50x faster)
- Add full-width search input with URL synchronization
- Sync search state to URL query parameters for shareable links
- URL takes precedence over localStorage for search initialization
- Filter both action buttons and map markers based on search
Map Controls Enhancements:
- Add showControlsDefault and allowControlsToggle settings
- Add showWaypointControls input to MapOverlayControls
- Hide waypoint controls for Index maps (only relevant for GPX routes)
- Fix map preview not responding to provider/osStyle changes
- Add ngOnChanges handlers for all map config properties
- Refactor map component files: rename *.component.ts to *.ts
- Add /test-data/ to .gitignore

Updated row type selector:
- Added displayValue() method to customize enum display
- Maps ALBUM_INDEX to "Index" for cleaner UI
- Keeps internal enum value unchanged for backward compatibility
Enhanced album index view with search filtering:
- Added search input with FontAwesome search icon
- Only shows search when >5 items (shouldShowSearch)
- filteredPageContent() filters columns by title and contentText
- Search applies to both action buttons and map rendering
- Case-insensitive substring matching
All phases complete for issue #97:
- Phase 1: Location row type for dynamic content
- Phase 2: Index multi-content support (albums + pages)
- Phase 3: Map rendering with clustering
- Phase 4: Search filtering and UI polish

Created DynamicContentViewAlbumIndexMapComponent:
- Leaflet-based map with marker clustering support
- Configurable map height, clustering threshold
- Click-to-navigate markers with rich popups
- Image thumbnails, titles, descriptions in popups
- Auto-fit bounds to show all markers
Updated content-text.model:
- Added location property to PageContentColumn interface
- Enables location data passthrough from pages to map
Enhanced LocationExtractionService:
- Now includes location coordinates in extracted columns
- Supports geocoded data for map rendering
Updated album index view component:
- Multi-render mode support (action buttons + map)
- Renders modes in selection order
- Passes map configuration from albumIndex to map component
- getRenderModes() defaults to ACTION_BUTTONS for backward compatibility
Added map configuration UI to album index editor:
- Render modes multi-select (action buttons, map)
- Conditional map config section (height, clustering toggle, threshold)
- ensureMapConfig() initializes defaults when MAP mode selected
- Defaults: height 500px, clustering enabled, threshold 10 items

Extended AlbumIndexService to support multiple content types:
- Added contentTypes property to AlbumIndex interface
- Defaults to [IndexContentType.ALBUMS] for backward compatibility
- Refactored album extraction into extractAlbumColumns method
- Integrated LocationExtractionService for PAGES content type
- Aggregates albums and pages based on contentTypes selection
Updated album index edit UI:
- Added ng-select multi-select for content type selection
- Selection order determines display order
- Initialization ensures backward compatibility
- Changed summary text from "albums" to "items" for generic display
Fixed Location edit component:
- Corrected AlertTarget import from alert-target.model
- Properly initialized notify instance in ngOnInit
- Added notification target template reference

Add new Location row type to capture and display location data within dynamic content pages.