mirror of
https://github.com/Freika/dawarich.git
synced 2026-01-11 17:51:39 -05:00
389 lines
9.6 KiB
Markdown
389 lines
9.6 KiB
Markdown
|
|
# Maps V2 - Incremental Implementation Phases
|
||
|
|
|
||
|
|
## Philosophy: Progressive Enhancement
|
||
|
|
|
||
|
|
Each phase delivers a **working, deployable application** with incremental features. Every phase includes:
|
||
|
|
- ✅ Production-ready code
|
||
|
|
- ✅ Complete E2E tests (Playwright)
|
||
|
|
- ✅ Deployment checklist
|
||
|
|
- ✅ Rollback strategy
|
||
|
|
|
||
|
|
You can **deploy after any phase** and have a functional map application.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Phase Overview
|
||
|
|
|
||
|
|
| Phase | Features | MVP Status | Deploy? | Timeline |
|
||
|
|
|-------|----------|------------|---------|----------|
|
||
|
|
| **Phase 1** | Basic map + Points layer | ✅ MVP | ✅ Yes | Week 1 |
|
||
|
|
| **Phase 2** | Routes + Date navigation | ✅ Enhanced | ✅ Yes | Week 2 |
|
||
|
|
| **Phase 3** | Heatmap + Mobile UI | ✅ Enhanced | ✅ Yes | Week 3 |
|
||
|
|
| **Phase 4** | Visits + Photos | ✅ Enhanced | ✅ Yes | Week 4 |
|
||
|
|
| **Phase 5** | Areas + Drawing tools | ✅ Enhanced | ✅ Yes | Week 5 |
|
||
|
|
| **Phase 6** | Fog + Scratch + Advanced | ✅ Full Parity | ✅ Yes | Week 6 |
|
||
|
|
| **Phase 7** | Real-time + Family sharing | ✅ Full Parity | ✅ Yes | Week 7 |
|
||
|
|
| **Phase 8** | Performance + Polish | ✅ Production | ✅ Yes | Week 8 |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Incremental Feature Progression
|
||
|
|
|
||
|
|
### Phase 1: MVP - Basic Map (Week 1)
|
||
|
|
**Goal**: Minimal viable map with points visualization
|
||
|
|
|
||
|
|
**Features**:
|
||
|
|
- ✅ MapLibre map initialization
|
||
|
|
- ✅ Points layer with clustering
|
||
|
|
- ✅ Basic popup on point click
|
||
|
|
- ✅ Simple date range selector (single month)
|
||
|
|
- ✅ API client for points endpoint
|
||
|
|
- ✅ Loading states
|
||
|
|
|
||
|
|
**E2E Tests** (`e2e/v2/phase-1-mvp.spec.ts`):
|
||
|
|
- Map loads successfully
|
||
|
|
- Points render on map
|
||
|
|
- Clicking point shows popup
|
||
|
|
- Date selector changes data
|
||
|
|
|
||
|
|
**Deploy Decision**: Basic location history viewer
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### Phase 2: Routes + Navigation (Week 2)
|
||
|
|
**Goal**: Add routes and better date navigation
|
||
|
|
|
||
|
|
**Features** (builds on Phase 1):
|
||
|
|
- ✅ Routes layer (speed-colored lines)
|
||
|
|
- ✅ Date picker with Previous/Next day/week/month
|
||
|
|
- ✅ Layer toggle controls (Points, Routes)
|
||
|
|
- ✅ Zoom controls
|
||
|
|
- ✅ Auto-fit bounds to data
|
||
|
|
|
||
|
|
**E2E Tests** (`e2e/v2/phase-2-routes.spec.ts`):
|
||
|
|
- Routes render correctly
|
||
|
|
- Date navigation works
|
||
|
|
- Layer toggles work
|
||
|
|
- Map bounds adjust to data
|
||
|
|
|
||
|
|
**Deploy Decision**: Full navigation + routes visualization
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### Phase 3: Heatmap + Mobile (Week 3)
|
||
|
|
**Goal**: Add heatmap and mobile-first UI
|
||
|
|
|
||
|
|
**Features** (builds on Phase 2):
|
||
|
|
- ✅ Heatmap layer
|
||
|
|
- ✅ Bottom sheet UI (mobile)
|
||
|
|
- ✅ Touch gestures (pinch, pan, swipe)
|
||
|
|
- ✅ Settings panel
|
||
|
|
- ✅ Responsive breakpoints
|
||
|
|
|
||
|
|
**E2E Tests** (`e2e/v2/phase-3-mobile.spec.ts`):
|
||
|
|
- Heatmap renders
|
||
|
|
- Bottom sheet works on mobile
|
||
|
|
- Touch gestures functional
|
||
|
|
- Settings persist
|
||
|
|
|
||
|
|
**Deploy Decision**: Mobile-optimized map viewer
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### Phase 4: Visits + Photos (Week 4)
|
||
|
|
**Goal**: Add visits detection and photo integration
|
||
|
|
|
||
|
|
**Features** (builds on Phase 3):
|
||
|
|
- ✅ Visits layer (suggested + confirmed)
|
||
|
|
- ✅ Photos layer with camera icons
|
||
|
|
- ✅ Visits drawer with search/filter
|
||
|
|
- ✅ Photo popup with preview
|
||
|
|
- ✅ Visit statistics
|
||
|
|
|
||
|
|
**E2E Tests** (`e2e/v2/phase-4-visits.spec.ts`):
|
||
|
|
- Visits render with correct colors
|
||
|
|
- Photos display on map
|
||
|
|
- Visits drawer opens/filters
|
||
|
|
- Photo popup shows image
|
||
|
|
|
||
|
|
**Deploy Decision**: Full location + visit tracking
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### Phase 5: Areas + Drawing (Week 5)
|
||
|
|
**Goal**: Add area management and drawing tools
|
||
|
|
|
||
|
|
**Features** (builds on Phase 4):
|
||
|
|
- ✅ Areas layer
|
||
|
|
- ✅ Area selector (rectangle selection)
|
||
|
|
- ✅ Area drawer (create circular areas)
|
||
|
|
- ✅ Area management UI
|
||
|
|
- ✅ Tracks layer
|
||
|
|
|
||
|
|
**E2E Tests** (`e2e/v2/phase-5-areas.spec.ts`):
|
||
|
|
- Areas render on map
|
||
|
|
- Drawing tools work
|
||
|
|
- Area selection functional
|
||
|
|
- Areas persist after creation
|
||
|
|
|
||
|
|
**Deploy Decision**: Interactive area management
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### Phase 6: Fog + Scratch + Advanced (Week 6)
|
||
|
|
**Goal**: Advanced visualization layers
|
||
|
|
|
||
|
|
**Features** (builds on Phase 5):
|
||
|
|
- ✅ Fog of war layer (canvas-based)
|
||
|
|
- ✅ Scratch map layer (visited countries)
|
||
|
|
- ✅ Keyboard shortcuts
|
||
|
|
- ✅ Click handler (centralized)
|
||
|
|
- ✅ Toast notifications
|
||
|
|
|
||
|
|
**E2E Tests** (`e2e/v2/phase-6-advanced.spec.ts`):
|
||
|
|
- Fog layer renders correctly
|
||
|
|
- Scratch map highlights countries
|
||
|
|
- Keyboard shortcuts work
|
||
|
|
- Notifications appear
|
||
|
|
|
||
|
|
**Deploy Decision**: 100% V1 feature parity
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### Phase 7: Real-time + Family (Week 7)
|
||
|
|
**Goal**: Real-time updates and family sharing
|
||
|
|
|
||
|
|
**Features** (builds on Phase 6):
|
||
|
|
- ✅ ActionCable integration
|
||
|
|
- ✅ Real-time point updates
|
||
|
|
- ✅ Family layer (shared locations)
|
||
|
|
- ✅ Live notifications
|
||
|
|
- ✅ WebSocket reconnection
|
||
|
|
|
||
|
|
**E2E Tests** (`e2e/v2/phase-7-realtime.spec.ts`):
|
||
|
|
- Real-time updates appear
|
||
|
|
- Family locations show
|
||
|
|
- WebSocket reconnects
|
||
|
|
- Notifications real-time
|
||
|
|
|
||
|
|
**Deploy Decision**: Full collaborative features
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### Phase 8: Performance + Production Polish (Week 8)
|
||
|
|
**Goal**: Optimize for production deployment
|
||
|
|
|
||
|
|
**Features** (builds on Phase 7):
|
||
|
|
- ✅ Lazy loading controllers
|
||
|
|
- ✅ Progressive data loading
|
||
|
|
- ✅ Performance monitoring
|
||
|
|
- ✅ Service worker (offline)
|
||
|
|
- ✅ Memory leak fixes
|
||
|
|
- ✅ Bundle optimization
|
||
|
|
|
||
|
|
**E2E Tests** (`e2e/v2/phase-8-performance.spec.ts`):
|
||
|
|
- Large datasets perform well
|
||
|
|
- Offline mode works
|
||
|
|
- No memory leaks
|
||
|
|
- Performance metrics met
|
||
|
|
|
||
|
|
**Deploy Decision**: Production-ready
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Testing Strategy
|
||
|
|
|
||
|
|
### E2E Test Structure
|
||
|
|
|
||
|
|
```
|
||
|
|
e2e/
|
||
|
|
└── v2/
|
||
|
|
├── phase-1-mvp.spec.ts # Basic map + points
|
||
|
|
├── phase-2-routes.spec.ts # Routes + navigation
|
||
|
|
├── phase-3-mobile.spec.ts # Heatmap + mobile
|
||
|
|
├── phase-4-visits.spec.ts # Visits + photos
|
||
|
|
├── phase-5-areas.spec.ts # Areas + drawing
|
||
|
|
├── phase-6-advanced.spec.ts # Fog + scratch
|
||
|
|
├── phase-7-realtime.spec.ts # Real-time + family
|
||
|
|
├── phase-8-performance.spec.ts # Performance tests
|
||
|
|
└── helpers/
|
||
|
|
├── setup.ts # Common setup
|
||
|
|
└── assertions.ts # Custom assertions
|
||
|
|
```
|
||
|
|
|
||
|
|
### Running Tests
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Run all V2 tests
|
||
|
|
npx playwright test e2e/v2/
|
||
|
|
|
||
|
|
# Run specific phase
|
||
|
|
npx playwright test e2e/v2/phase-1-mvp.spec.ts
|
||
|
|
|
||
|
|
# Run in headed mode (watch)
|
||
|
|
npx playwright test e2e/v2/phase-1-mvp.spec.ts --headed
|
||
|
|
|
||
|
|
# Run with UI
|
||
|
|
npx playwright test e2e/v2/ --ui
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Deployment Strategy
|
||
|
|
|
||
|
|
### After Each Phase
|
||
|
|
|
||
|
|
1. **Run E2E tests**
|
||
|
|
```bash
|
||
|
|
npx playwright test e2e/v2/phase-X-*.spec.ts
|
||
|
|
```
|
||
|
|
|
||
|
|
2. **Run previous phase tests** (regression)
|
||
|
|
```bash
|
||
|
|
npx playwright test e2e/v2/phase-[1-X]-*.spec.ts
|
||
|
|
```
|
||
|
|
|
||
|
|
3. **Deploy to staging**
|
||
|
|
```bash
|
||
|
|
git checkout -b maps-v2-phase-X
|
||
|
|
# Deploy to staging environment
|
||
|
|
```
|
||
|
|
|
||
|
|
4. **Manual QA checklist** (in each phase guide)
|
||
|
|
|
||
|
|
5. **Deploy to production** (if approved)
|
||
|
|
|
||
|
|
### Rollback Strategy
|
||
|
|
|
||
|
|
Each phase is self-contained. If Phase N has issues:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Revert to Phase N-1
|
||
|
|
git checkout maps-v2-phase-N-1
|
||
|
|
# Redeploy
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Progress Tracking
|
||
|
|
|
||
|
|
### Phase Completion Checklist
|
||
|
|
|
||
|
|
For each phase:
|
||
|
|
- [ ] All code implemented
|
||
|
|
- [ ] E2E tests passing
|
||
|
|
- [ ] Previous phase tests passing (regression)
|
||
|
|
- [ ] Manual QA complete
|
||
|
|
- [ ] Deployed to staging
|
||
|
|
- [ ] User acceptance testing
|
||
|
|
- [ ] Performance acceptable
|
||
|
|
- [ ] Documentation updated
|
||
|
|
|
||
|
|
### Example Workflow
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Week 1: Phase 1
|
||
|
|
- Implement Phase 1 code
|
||
|
|
- Write e2e/v2/phase-1-mvp.spec.ts
|
||
|
|
- All tests pass ✅
|
||
|
|
- Deploy to staging ✅
|
||
|
|
- User testing ✅
|
||
|
|
- Deploy to production ✅
|
||
|
|
|
||
|
|
# Week 2: Phase 2
|
||
|
|
- Implement Phase 2 code (on top of Phase 1)
|
||
|
|
- Write e2e/v2/phase-2-routes.spec.ts
|
||
|
|
- Run phase-1-mvp.spec.ts (regression) ✅
|
||
|
|
- Run phase-2-routes.spec.ts ✅
|
||
|
|
- Deploy to staging ✅
|
||
|
|
- User testing ✅
|
||
|
|
- Deploy to production ✅
|
||
|
|
|
||
|
|
# Continue...
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Feature Flags
|
||
|
|
|
||
|
|
Use feature flags for gradual rollout:
|
||
|
|
|
||
|
|
```ruby
|
||
|
|
# config/features.yml
|
||
|
|
maps_v2:
|
||
|
|
enabled: true
|
||
|
|
phases:
|
||
|
|
phase_1: true # MVP
|
||
|
|
phase_2: true # Routes
|
||
|
|
phase_3: true # Mobile
|
||
|
|
phase_4: false # Visits (not deployed yet)
|
||
|
|
phase_5: false
|
||
|
|
phase_6: false
|
||
|
|
phase_7: false
|
||
|
|
phase_8: false
|
||
|
|
```
|
||
|
|
|
||
|
|
Enable phases progressively as they're tested and approved.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## File Organization
|
||
|
|
|
||
|
|
### Phase-Based Modules
|
||
|
|
|
||
|
|
Each phase adds new files without modifying previous:
|
||
|
|
|
||
|
|
```javascript
|
||
|
|
// Phase 1
|
||
|
|
app/javascript/maps_v2/
|
||
|
|
├── controllers/map_controller.js # Phase 1
|
||
|
|
├── services/api_client.js # Phase 1
|
||
|
|
├── layers/points_layer.js # Phase 1
|
||
|
|
└── utils/geojson_transformers.js # Phase 1
|
||
|
|
|
||
|
|
// Phase 2 adds:
|
||
|
|
├── controllers/date_picker_controller.js # Phase 2
|
||
|
|
├── layers/routes_layer.js # Phase 2
|
||
|
|
└── components/layer_controls.js # Phase 2
|
||
|
|
|
||
|
|
// Phase 3 adds:
|
||
|
|
├── controllers/bottom_sheet_controller.js # Phase 3
|
||
|
|
├── layers/heatmap_layer.js # Phase 3
|
||
|
|
└── utils/gestures.js # Phase 3
|
||
|
|
|
||
|
|
// etc...
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Benefits of This Approach
|
||
|
|
|
||
|
|
✅ **Deployable at every step** - No waiting 8 weeks for first deploy
|
||
|
|
✅ **Easy testing** - Each phase has focused E2E tests
|
||
|
|
✅ **Safe rollback** - Can revert to any previous phase
|
||
|
|
✅ **User feedback** - Get feedback early and often
|
||
|
|
✅ **Risk mitigation** - Small, incremental changes
|
||
|
|
✅ **Team velocity** - Can parallelize some phases
|
||
|
|
✅ **Business value** - Deliver value incrementally
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Next Steps
|
||
|
|
|
||
|
|
1. **Review this overview** - Does the progression make sense?
|
||
|
|
2. **Restructure PHASE_X.md files** - Reorganize content by new phases
|
||
|
|
3. **Create E2E test templates** - One per phase
|
||
|
|
4. **Update README.md** - Link to new phase structure
|
||
|
|
5. **Begin Phase 1** - Start with MVP implementation
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Questions to Consider
|
||
|
|
|
||
|
|
- Should Phase 1 be even simpler? (e.g., no clustering initially?)
|
||
|
|
- Should we add a Phase 0 for setup/dependencies?
|
||
|
|
- Any features that should move to earlier phases?
|
||
|
|
- Any features that can be deferred to later?
|
||
|
|
|
||
|
|
Let me know if this structure works, and I'll restructure the existing PHASE files accordingly!
|