13 KiB
13 KiB
Changelog
All notable changes to Seismo Fleet Manager will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.3.2 - 2025-12-12
Added
- Progressive Web App (PWA) Mobile Optimization: Complete mobile-first redesign for field deployment usage
- Responsive Navigation: Hamburger menu with slide-in sidebar for mobile, always-visible sidebar for desktop
- Bottom Navigation Bar: Quick access to Dashboard, Roster, Add Unit, and Settings (mobile only)
- Mobile Card View: Compact card layout for roster units with status dots, location, and project ID
- Tap-to-Navigate: Location addresses and coordinates are clickable and open in user's default navigation app (Google Maps, Apple Maps, Waze, etc.)
- Unit Detail Modal: Bottom sheet modal showing full unit details with edit capabilities (tap any unit card to open)
- Touch Optimization: 44x44px minimum button targets following iOS/Android accessibility guidelines
- Service Worker: Network-first caching strategy for offline-capable operation
- IndexedDB Storage: Offline data persistence for unit information and pending edits
- Background Sync: Queues edits made while offline and syncs automatically when connection returns
- Offline Indicator: Visual banner showing offline status with manual sync button
- PWA Manifest: Installable as a standalone app on mobile devices with custom icons
- Hard Reload Button: "Clear Cache & Reload" utility in sidebar menu to force fresh JavaScript/CSS
- Mobile-Specific Files:
backend/static/mobile.css- Mobile UI styles, hamburger menu, bottom nav, cards, modalsbackend/static/mobile.js- Mobile interactions, offline sync, modal managementbackend/static/sw.js- Service worker for PWA functionalitybackend/static/offline-db.js- IndexedDB wrapper for offline storagebackend/static/manifest.json- PWA configurationbackend/static/icons/- 8 PWA icon sizes (72px-512px)
Changed
- Dashboard Alerts: Only show Missing units in notifications (Pending units no longer appear in alerts)
- Roster Template: Mobile card view shows status from server-side render instead of fetching separately
- Mobile Status Display: Benched units show "Benched" label instead of "Unknown" or "N/A"
- Base Template: Added cache-busting query parameters to JavaScript files (e.g.,
mobile.js?v=0.3.2) - Sidebar Menu: Added utility section with "Toggle theme" and "Clear Cache & Reload" buttons
Fixed
- Modal Status Display: Fixed unit detail modal showing "Unknown" status by passing status data from card to modal
- Mobile Card Status: Fixed grey dot with "Unknown" label for benched units - now properly shows deployment state
- Status Data Passing: Roster cards now pass status and age to modal via function parameters and global status map
- Service Worker Caching: Aggressive browser caching issue resolved with version query parameters and hard reload function
Technical Details
- Mobile breakpoint at 768px (
md:prefix in TailwindCSS) - PWA installable via Add to Home Screen on iOS/Android
- Service worker caches all static assets with network-first strategy
- Google Maps search API used for universal navigation links (works across all map apps)
- Status map stored in
window.rosterStatusMapfrom server-side rendered data - Hard reload function clears service worker caches, unregisters workers, and deletes IndexedDB
0.3.1 - 2025-12-12
Fixed
- Dashboard Notifications: Removed Pending units from alert list - only Missing units now trigger notifications
- Status Dots: Verified deployed units display correct status dots (OK=green, Pending=yellow, Missing=red) in both active and benched tables
- Mobile Card View: Fixed roster cards showing "Unknown" status by using
.get()with defaults in backend routes - Backend Status Handling: Added default values for status, age, last_seen fields to prevent KeyError exceptions
Changed
- Backend roster partial routes (
/partials/roster-deployed,/partials/roster-benched) now use.get()method with sensible defaults - Deployed units default to "Unknown" status when data unavailable
- Benched units default to "N/A" status when data unavailable
0.3.0 - 2025-12-09
Added
- Series 4 (Micromate) Support: New
/api/series4/heartbeatendpoint for receiving telemetry from Series 4 Micromate units- Auto-detection of Series 4 units via UM##### ID pattern
- Stores project hints from emitter payload in unit notes
- Automatic unit type classification across both Series 3 and Series 4 endpoints
- Development Environment Labels: Visual indicators to distinguish dev from production deployments
- Yellow "DEV" badge in sidebar navigation
- "[DEV]" prefix in browser title
- Yellow banner on dashboard when running in development mode
- Environment variable support in docker-compose.yml (ENVIRONMENT=production|development)
- Quality of Life Improvements:
- Human-readable relative timestamps (e.g., "2h 15m ago", "3d ago") with full date in tooltips
- "Last Updated" timestamp indicator on dashboard
- Status icons for colorblind accessibility (checkmark for OK, clock for Pending, X for Missing)
- Breadcrumb navigation on unit detail pages
- Copy-to-clipboard buttons for unit IDs
- Search/filter functionality for fleet roster table
- Improved empty state messages with icons
- Timezone Support: Comprehensive timezone handling across the application
- Timezone selector in Settings (defaults to America/New_York EST)
- Human-readable timestamp format (e.g., "9/10/2020 8:00 AM EST")
- Timezone-aware display for all timestamps site-wide
- Settings stored in localStorage for immediate effect
- Settings Page Redesign: Complete overhaul with tabbed interface and persistent preferences
- General Tab: Display preferences (timezone, theme, auto-refresh interval)
- Data Management Tab: Safe operations (CSV export, merge import, roster table)
- Advanced Tab: Power user settings (replace mode import, calibration defaults, status thresholds)
- Danger Zone Tab: Destructive operations isolated with enhanced warnings
- Backend preferences storage via new UserPreferences model
- Tab state persistence in localStorage
- Smooth animations and consistent styling with existing pages
- User Preferences API: New backend endpoints for persistent settings storage
GET /api/settings/preferences- Retrieve all user preferencesPUT /api/settings/preferences- Update preferences (supports partial updates)- Database-backed storage for cross-device preference sync
- Migration script:
backend/migrate_add_user_preferences.py
Changed
- Timestamps now display in user-selected timezone with human-readable format throughout the application
- Settings page reorganized from 644-line flat layout to clean 4-tab interface
- CSV Replace Mode moved from Data Management to Advanced tab with additional warnings
- Import operations separated: safe merge in Data Management tab, destructive replace in Advanced tab
- Page title changed from "Roster Manager" to "Settings" for better clarity
- All preferences now persist to backend database instead of relying solely on localStorage
Fixed
- Unit type classification now consistent across Series 3 and Series 4 heartbeat endpoints
- Auto-correction of misclassified unit types when they report to wrong endpoint
Technical Details
- New
detect_unit_type()helper function for pattern-based unit classification - UserPreferences model with single-row table pattern (id=1) for global settings
- Series 4 units identified by UM prefix followed by digits (e.g., UM11719)
- JavaScript Intl API used for client-side timezone conversion
- Pydantic schema for partial preference updates (PreferencesUpdate model)
- Environment context injection via custom FastAPI template response wrapper
0.2.1 - 2025-12-03
Added
/settingsroster manager page with CSV export/import, live stats, and danger-zone reset controls./api/settingsrouter that exposesexport-csv,stats,roster-units,import-csv-replace, and the clear-* endpoints backing the UI.- Dedicated HTMX partials/tabs for deployed, benched, retired, and ignored units plus new ignored-table UI to unignore or delete entries.
Changed
- Roster and unit detail templates now display device-type specific metadata (calibration windows, modem pairings, IP/phone fields) alongside inline actions.
- Base navigation highlights the new settings workflow and routes retired/ignored buckets through dedicated endpoints + partials.
Fixed
- Snapshot summary counts only consider deployed units, preventing dashboard alerts from including benched hardware.
- Snapshot payloads now include address/coordinate metadata so map widgets and CSV exports stay accurate.
0.2.0 - 2025-12-03
Added
- Device-type aware roster schema (seismographs vs modems) with new metadata columns plus
backend/migrate_add_device_types.pyfor upgrading existing SQLite files. create_test_db.pyhelper that generates a ready-to-use demo database with sample seismographs, modems, and emitter rows.- Ignore list persistence/API so noisy legacy emitters can be quarantined via
/api/roster/ignoreand surfaced in the UI. - Roster page enhancements: Add Unit modal, CSV import modal, and HTMX-powered table fed by
/partials/roster-table. - Unit detail view rewritten to fetch data via API, expose deployment status, and allow edits to all metadata.
Changed
- Snapshot service now merges roster + emitter data into active/benched/retired/unknown buckets and includes device-specific metadata in each record.
- Roster edit endpoints parse date fields, manage modem/seismograph specific attributes, and guarantee records exist when toggling deployed/retired states.
- Dashboard partial endpoints are grouped under
/dashboard/*so HTMX tabs stay in sync with the consolidated snapshot payload.
Fixed
- Toggling deployed/retired flags no longer fails when a unit does not exist because the router now auto-creates placeholder roster rows.
- CSV import applies address/coordinate updates instead of silently dropping unknown columns.
0.1.1 - 2025-12-02
Added
- Roster Editing API: Full CRUD operations for roster management
POST /api/roster/add- Add new units to rosterPOST /api/roster/set-deployed/{unit_id}- Toggle deployment statusPOST /api/roster/set-retired/{unit_id}- Toggle retired statusPOST /api/roster/set-note/{unit_id}- Update unit notes
- CSV Import: Bulk roster import functionality
POST /api/roster/import-csv- Import units from CSV file- Support for all roster fields: unit_id, unit_type, deployed, retired, note, project_id, location
- Optional update_existing parameter to control duplicate handling
- Detailed import summary with added/updated/skipped/error counts
- Enhanced Database Models:
- Added
project_idfield to RosterUnit model - Added
locationfield to RosterUnit model - Added
last_updatedtimestamp tracking
- Added
- Dashboard Enhancements:
- Separate views for Active, Benched, and Retired units
- New endpoints:
/dashboard/activeand/dashboard/benched
Fixed
- Database session management bug in
emit_status_snapshot()- Added
get_db_session()helper function for direct session access - Implemented proper session cleanup with try/finally blocks
- Added
- Database schema synchronization issues
- Database now properly recreates when model changes are detected
Changed
- Updated RosterUnit model to include additional metadata fields
- Improved error handling in CSV import with row-level error reporting
- Enhanced snapshot service to properly manage database connections
Technical Details
- All roster editing endpoints use Form data for better HTML form compatibility
- CSV import uses multipart/form-data for file uploads
- Boolean fields in CSV accept: 'true', '1', 'yes' (case-insensitive)
- Database sessions now properly closed to prevent connection leaks
0.1.0 - 2024-11-20
Added
- Initial release of Seismo Fleet Manager
- FastAPI-based REST API for fleet management
- SQLite database with SQLAlchemy ORM
- Emitter reporting endpoints
- Basic fleet status monitoring
- Docker and Docker Compose support
- Web-based dashboard with HTMX
- Dark/light mode toggle
- Interactive maps with Leaflet
- Photo management per unit
- Automated status categorization (OK/Pending/Missing)