dawarich/JAVASCRIPT_FEATURES.md
2025-10-30 19:17:31 +01:00

631 lines
15 KiB
Markdown

# Dawarich JavaScript Features Documentation
This document provides a detailed overview of all JavaScript features implemented in the Dawarich application, organized by functionality.
## Table of Contents
- [Map Features](#map-features)
- [Routes & Tracks](#routes--tracks)
- [Visits Management](#visits-management)
- [Areas](#areas)
- [Photos Integration](#photos-integration)
- [Live Mode](#live-mode)
- [Visualization Features](#visualization-features)
- [Search & Navigation](#search--navigation)
- [Family Sharing](#family-sharing)
- [Controllers](#controllers)
---
## Map Features
### Main Maps Controller (`maps_controller.js`)
The primary controller managing all map interactions and visualizations.
#### Core Functionality
- **Map Initialization**
- Leaflet.js-based interactive map
- Multiple base layer support (OpenStreetMap, custom tiles)
- User-preferred layer persistence
- PostGIS coordinate system support
- Custom panes for z-index management
- **Layer Management**
- Points layer (location markers)
- Routes layer (polylines)
- Tracks layer (GPS tracks)
- Heatmap layer
- Fog of War layer
- Scratch map layer (visited countries)
- Areas layer (user-defined regions)
- Photos layer (geotagged images)
- Visits layer (detected location visits)
- Family members layer
- **Settings Panel**
- Route opacity adjustment (10-100%)
- Fog of War radius customization
- Time/distance thresholds for route splitting
- Points rendering mode (raw/simplified)
- Live map toggle
- Speed-colored routes configuration
- Speed color scale editor with gradient stops
- **Calendar Panel**
- Year selection dropdown
- Month navigation grid
- Tracked months visualization
- Visited cities display
- Date range filtering
- **Scale & Stats Control**
- Distance scale (km/miles)
- Total distance display
- Points count display
- Dynamic unit conversion
---
## Routes & Tracks
### Routes (`maps/polylines.js`)
#### Features
- **Intelligent Route Splitting**
- Distance-based splitting (meters between points)
- Time-based splitting (minutes between points)
- Configurable thresholds
- **Speed Visualization**
- Color-coded routes based on GPS velocity
- Customizable color gradient scale
- Speed ranges: 0-15 km/h (green), 15-30 km/h (cyan), 30-50 km/h (magenta), 50-100 km/h (yellow), 100+ km/h (red)
- Real-time gradient editor
- **Interactive Features**
- Hover highlighting with increased opacity
- Click to lock selection
- Start/end markers (🚥 and 🏁)
- Popup with route details:
- Start and end timestamps
- Duration (days, hours, minutes)
- Total distance
- Current segment speed
- **Performance Optimizations**
- Canvas renderer for large datasets
- Batch processing for updates
- Custom pane management (z-index 450)
### Tracks (`maps/tracks.js`)
GPS tracks represent processed and analyzed routes with elevation data.
#### Features
- **Track Visualization**
- Distinct red color (vs blue routes)
- Elevated pane (z-index 460)
- Start (🚀) and end (🎯) markers
- **Track Information Display**
- Start/end timestamps
- Duration
- Distance
- Average speed
- Elevation gain/loss
- Max/min altitude
- **Real-time Updates**
- WebSocket integration via TracksChannel
- Incremental track updates (create/update/delete)
- Time range filtering
- Memory-efficient updates
---
## Visits Management
### Visits System (`maps/visits.js`)
Advanced location visit detection and management system.
#### Core Features
- **Visit Detection**
- Automatic visit suggestions based on dwell time
- Confirmed vs suggested visits (separate layers)
- Custom panes for proper z-index ordering
- Visual distinction (blue for confirmed, orange/dashed for suggested)
- **Area Selection Tool**
- Click-and-drag rectangle selection
- Filter visits within selected area
- Points within bounds calculation
- Date-grouped summary panel
- **Visit Drawer UI**
- Sliding side panel
- Hierarchical visit list
- Visit status indicators
- Quick actions (confirm/decline)
- **Visit Operations**
- Confirm suggested visits
- Decline unwanted visits
- Merge multiple visits
- Bulk operations (confirm/decline multiple)
- Delete visits with confirmation
- Edit visit name and location
- **Interactive Features**
- Checkbox selection with smart visibility
- Adjacent visit highlighting
- Map circle highlighting on hover
- Click visit to center map
- Possible places dropdown
- Duration formatting
- **Visit Details**
- Name and address
- Start and end timestamps
- Duration estimation
- Location coordinates
- City, state, country
- Status (suggested/confirmed/declined)
---
## Areas
### Area Management (`maps/areas.js`)
User-defined geographic areas for visit tracking.
#### Features
- **Area Creation**
- Leaflet.draw integration
- Circle drawing tool
- Interactive popup form
- Name input validation
- Custom pane (z-index 605)
- **Area Display**
- Red circle markers
- Semi-transparent fill
- Hover effects (increased opacity)
- Click to show details
- **Area Information**
- Name
- Radius (meters)
- Center coordinates
- Area ID badge
- **Area Management**
- Delete confirmation
- Theme-aware styling
- API integration for CRUD operations
---
## Photos Integration
### Photo Layer (`maps/photos.js`)
Integration with Immich and Photoprism for geotagged photos.
#### Features
- **Photo Sources**
- Immich integration
- Photoprism integration
- Source URL configuration
- **Photo Markers**
- 48x48px thumbnail markers
- Lazy loading with retry logic
- Loading spinner animation
- Error handling
- **Photo Popups**
- Full thumbnail preview
- Original filename
- Capture timestamp
- Location (city, state, country)
- Source system link
- Type indicator (📷 photo / 🎥 video)
- Hover shadow effects
- **Performance**
- Promise-based loading
- Progressive rendering
- Automatic retry (3 attempts)
- Date range filtering
---
## Live Mode
### Live Map Handler (`maps/live_map_handler.js`)
Real-time GPS tracking with memory-efficient streaming.
#### Features
- **Memory Management**
- Bounded data structures (max 1000 points)
- Automatic old point removal
- Prevents memory leaks
- Incremental updates
- **Real-time Updates**
- WebSocket integration (PointsChannel)
- Live marker addition
- Incremental polyline segments
- Heatmap updates
- Auto-pan to new location
- **Layer Synchronization**
- Markers layer updates
- Polylines layer incremental updates
- Heatmap point management
- Fog of War updates
- **Performance**
- No full layer recreation
- Direct marker references
- Efficient last marker tracking
- Smart cleanup on disable
---
## Visualization Features
### Fog of War (`maps/fog_of_war.js`)
Gamification feature showing unexplored areas.
#### Features
- **Canvas-based Rendering**
- Overlay at z-index 400
- RGBA fog layer (0,0,0,0.4)
- destination-out composite operation
- Responsive to map size changes
- **Smart Fog Clearing**
- Circular cleared areas around points
- Line connections between nearby points
- Configurable clear radius (meters)
- Time threshold for connections
- Rounded line caps and joins
- **Dynamic Updates**
- Pan and zoom responsive
- Real-time recalculation
- Map resize handling
- Stored parameters for efficiency
### Scratch Map (`maps/scratch_layer.js`)
World map showing visited countries.
#### Features
- **Country Visualization**
- GeoJSON country borders
- Golden overlay (fillColor: #FFD700)
- Orange borders (color: #FFA500)
- ISO 3166-1 Alpha-2 code matching
- **Data Management**
- Country code mapping
- Unique country extraction
- Cached world borders data
- Automatic refresh
- **Integration**
- Layer control toggle
- Marker data updates
- Visibility state tracking
### Heatmap
Built-in Leaflet.heat plugin for density visualization.
- **Configuration**
- 20px radius
- 0.2 intensity per point
- Automatic color gradient
- Layer control toggle
---
## Search & Navigation
### Location Search (`maps/location_search.js`)
Advanced location search with visit history.
#### Features
- **Search Interface**
- Inline search bar (400px wide)
- Search toggle button with Lucide icon
- Keyboard shortcuts (Enter, Escape, Arrow keys)
- Click-outside-to-close
- Auto-position next to button
- **Suggestions System**
- Real-time autocomplete (300ms debounce)
- Keyboard navigation (↑↓ arrows)
- Suggestion highlighting
- 2-character minimum query
- **Search Results**
- Hierarchical results (location → years → visits)
- Collapsible year sections
- Visit count per location
- Date range display
- Duration estimates
- **Visit Navigation**
- Click visit to zoom and highlight
- Time filter events
- 4-hour window around visit
- Special visit markers (green circles)
- **Visit Creation**
- Create visit from search result
- Pre-filled form with location data
- Datetime picker for start/end
- Duration calculation
- Validation
- **Map Integration**
- Position relative to button
- Maintains position during map pan/zoom
- Prevents map scroll interference
- Visits layer refresh after creation
---
## Family Sharing
### Family Members Controller (`family_members_controller.js`)
Real-time family member location sharing.
#### Features
- **Family Member Markers**
- Circular avatars with email initials
- Green color scheme (#10B981)
- White border and shadow
- Distinct from other markers
- **Real-time Updates**
- ActionCable integration (FamilyLocationsChannel)
- Incremental position updates
- Recent update animation (< 5 minutes)
- Pulse effect for active updates
- **Location Information**
- Email address
- Coordinates (6 decimal precision)
- Battery level with colored icons
- Battery status (charging/full)
- Last seen timestamp
- **Battery Indicators**
- Lucide battery icons
- Color-coded: red (≤20%), orange (≤50%), green (>50%)
- Charging icon when plugged in
- Full battery indicator
- **Map Integration**
- Permanent tooltips (last seen + battery)
- Detailed popups on click
- Theme-aware styling
- Auto-zoom to fit all members
- Layer control integration
- **Refresh Management**
- 60-second periodic refresh (fallback)
- Manual refresh button
- Automatic stop when layer disabled
- User feedback on manual refresh
---
## Controllers
### Base Controller (`base_controller.js`)
Common functionality for all Stimulus controllers.
### Other Controllers
- **`datetime_controller.js`**: Date/time picker initialization
- **`imports_controller.js`**: File import progress tracking
- **`trips_controller.js`**: Trip management UI
- **`stat_page_controller.js`**: Statistics page interactions
- **`clipboard_controller.js`**: Copy-to-clipboard functionality
- **`notifications_controller.js`**: Real-time notifications
- **`sharing_modal_controller.js`**: Public sharing UI
- **`map_preview_controller.js`**: Embedded map previews
- **`visit_modal_map_controller.js`**: Visit creation map
- **`add_visit_controller.js`**: Visit addition flow
- **`public_stat_map_controller.js`**: Public stat sharing maps
---
## Technical Details
### Map Controls & UI
- **Top-Right Buttons** (`maps/map_controls.js`)
- Select Area tool
- Add Visit button
- Calendar toggle
- Visits drawer toggle
- Consistent ordering and styling
- **Theme Support** (`maps/theme_utils.js`)
- Dark/light theme detection
- Automatic control styling
- Button theme adaptation
- Panel theme colors
- Oklahoma-based color system
### Helper Functions (`maps/helpers.js`)
- **Date Formatting**: Timezone-aware timestamp conversion
- **Distance Formatting**: km/miles with proper units
- **Speed Formatting**: km/h or mph conversion
- **Duration Formatting**: Days, hours, minutes display
- **Haversine Distance**: Accurate geographic distance calculation
- **Flash Messages**: User notification system
### Markers (`maps/markers.js`, `maps/marker_factory.js`)
- **Standard Markers**: CircleMarkers with popups
- **Live Markers**: Optimized for streaming
- **Popup Content**: Delete button, coordinates, timestamp, battery, velocity
- **Marker Clustering**: Performance optimization for large datasets
### Layers Configuration (`maps/layers.js`)
- **Raster Maps** (`raster_maps_config.js`)
- OpenStreetMap
- Stadia Maps (Alidade Smooth)
- CartoDB
- Stamen
- **Vector Maps** (`vector_maps_config.js`)
- Self-hosted vector tiles
- Optional fallback system
### Performance Monitoring
- **Tile Monitor** (`maps/tile_monitor.js`)
- Track tile load times
- Identify slow tiles
- Performance metrics API
---
## WebSocket Channels
### PointsChannel (`channels/points_channel.js`)
Real-time GPS point streaming for live mode.
### TracksChannel
Real-time track updates (create/update/delete).
### FamilyLocationsChannel (`channels/family_locations_channel.js`)
Real-time family member location updates.
### NotificationsChannel (`channels/notifications_channel.js`)
System notifications and alerts.
### ImportsChannel (`channels/imports_channel.js`)
Import progress updates.
---
## Key Technologies
- **Leaflet.js**: Core mapping library
- **Stimulus**: JavaScript framework
- **Hotwired Turbo**: SPA-like navigation
- **ActionCable**: WebSocket integration
- **Canvas API**: High-performance rendering
- **GeoJSON**: Geographic data format
- **PostGIS**: Spatial database queries
---
## Configuration
Map features are controlled through user settings:
- `route_opacity`: Route visibility (0.0-1.0)
- `fog_of_war_meters`: Fog clear radius
- `fog_of_war_threshold`: Seconds between fog lines
- `meters_between_routes`: Route split distance
- `minutes_between_routes`: Route split time
- `time_threshold_minutes`: Visit detection threshold
- `merge_threshold_minutes`: Visit merge threshold
- `points_rendering_mode`: Raw or simplified
- `live_map_enabled`: Enable live mode
- `speed_colored_routes`: Enable speed colors
- `speed_color_scale`: Custom gradient definition
- `preferred_map_layer`: Base layer selection
- `enabled_map_layers`: Active overlay layers
- `maps.distance_unit`: km or mi
- `maps.url`: Custom tile server
- `immich_url`: Immich server
- `photoprism_url`: Photoprism server
---
## Data Flow
1. **Initial Load**: Server renders map with data attributes
2. **Controller Connect**: Stimulus initializes map and layers
3. **User Interaction**: Events trigger controller methods
4. **API Calls**: Fetch/update data via REST API
5. **WebSocket Updates**: Real-time data via ActionCable
6. **Layer Updates**: Incremental map updates
7. **Settings Persistence**: API saves user preferences
---
## Memory Management
- Bounded arrays for live mode (max 1000 points)
- Marker reference tracking for efficient updates
- Layer cleanup on disconnect
- Event listener removal
- Canvas context management
- GeoJSON data caching
---
## Accessibility Features
- Keyboard navigation for search
- Theme-aware color schemes
- Clear visual indicators
- Tooltip descriptions
- Confirmation dialogs for destructive actions
- Error message display
- Loading states
---
## Future Enhancements
Potential areas for expansion:
- Route editing capabilities
- Custom area shapes (polygons)
- Enhanced photo filtering
- Route comparison tools
- Advanced track statistics
- Export to GPX/GeoJSON
- Offline map support
- Route planning
- Custom marker icons
- Geofencing alerts