Replacing the map legend icon with a comprehensive campaign reports system that provides actionable intelligence for campaigns.
Purpose: Identify high/low turnout precincts for resource allocation Data:
- Precinct ID and name
- Total registered voters
- Total votes cast
- Turnout percentage
- Ranking (highest to lowest)
- Party breakdown (Dem/Rep votes and percentages)
Export: CSV with all precincts ranked by turnout
Purpose: Target voters who changed party affiliation Data:
- Voter name
- Address (full street address)
- Previous party voted
- Current party voted
- Precinct
- Age/gender (if available)
Export: CSV with full contact information for door-knocking/phone banking
Purpose: Generate walk lists for GOTV canvassing Data:
- Voter name
- Full address
- Precinct
- Registration date
- Last voted (election date)
- Voting history score (how often they vote)
- Age/gender
Filters:
- By precinct
- By street/neighborhood
- By voting history (sporadic vs never voted)
Export: CSV formatted for walk list apps (MiniVAN, etc.)
Purpose: Identify and activate first-time voters Data:
- Voter name
- Address
- Party voted
- Precinct
- Age
- Registration date
Export: CSV for targeted outreach
- Change from
fa-maptofa-chart-barorfa-file-alt(reports icon) - Update title from "Map Options" to "Campaign Reports"
- Keep same positioning (bottom right)
Campaign Reports
├── Precinct Performance
│ ├── View Report (table)
│ └── Download CSV
├── Party Switchers
│ ├── Filter: D→R / R→D / Both
│ ├── View Report (table with addresses)
│ └── Download CSV
├── Turf Cuts (Non-Voters)
│ ├── Filter: Precinct, Street, Voting History
│ ├── View Report (table)
│ └── Download Walk List CSV
└── New Voters
├── Filter: Party, Precinct
├── View Report (table)
└── Download CSV
Parameters:
county(required)election_date(required)
Returns: JSON array of precincts with turnout stats
Parameters:
county(required)election_date(required)direction(optional: 'd2r', 'r2d', 'both')
Returns: JSON array of voters with full details
Parameters:
county(required)precinct(optional)street(optional)voting_history(optional: 'never', 'sporadic', 'all')
Returns: JSON array of registered non-voters
Parameters:
county(required)election_date(required)party(optional: 'Democratic', 'Republican', 'both')
Returns: JSON array of first-time voters
- All reports require authentication
- PII (names, addresses) only accessible to logged-in users
- Rate limiting on CSV exports
- Audit logging of report access
public/index.html- Update icon and add reports modalpublic/reports.js- New file for reports UI logicpublic/reports.css- New file for reports stylingbackend/app.py- Add 4 new report endpointsbackend/reports.py- New file with report generation logic
- Update UI (icon + modal)
- Create backend endpoints
- Build frontend report viewers
- Add CSV export functionality
- Test with real data
- Add remaining reports in Phase 2