import React, { useState } from 'react'; import HomePage from './components/HomePage'; import ImpactDashboard from './components/ImpactDashboard'; import TopicNavigation from './components/TopicNavigation'; import Summary from './components/Summary'; import WordsVsDollars from './components/WordsVsDollars'; import EndlessStudyLoop from './components/EndlessStudyLoop'; import WhereMoneyWent from './components/WhereMoneyWent'; import WhoIsInCharge from './components/WhoIsInCharge'; import FilterPanel from './components/shared/FilterPanel'; import DecisionCard from './components/shared/DecisionCard'; import { metadata } from './data/dashboardData'; import { Home, Layout, Grid, List, BarChart3 } from 'lucide-react'; const tabs = [ { id: 0, label: 'Summary', component: Summary }, { id: 1, label: 'They cut health spending while praising wellness', component: WordsVsDollars }, { id: 2, label: 'Delayed 6 months and counting', component: EndlessStudyLoop }, { id: 3, label: 'What got funded instead', component: WhereMoneyWent }, { id: 4, label: 'One memo beat 240 residents', component: WhoIsInCharge }, ]; export default function App() { const [active, setActive] = useState(0); const [viewMode, setViewMode] = useState('home'); // 'home', 'impact', 'dashboards', 'decisions', 'browse' const [selectedPersona, setSelectedPersona] = useState(null); const [selectedTopic, setSelectedTopic] = useState(null); const [selectedDomains, setSelectedDomains] = useState([]); const [selectedTopics, setSelectedTopics] = useState([]); const [selectedPatterns, setSelectedPatterns] = useState([]); const [selectedResources, setSelectedResources] = useState([]); const [searchQuery, setSearchQuery] = useState(''); const handlePersonaSelect = (persona, topic) => { setSelectedPersona(persona); setSelectedTopic(topic); setViewMode('impact'); }; const handleTopicSelect = (topicId) => { setSelectedTopics([topicId]); setViewMode('browse'); }; const handleDomainToggle = (domainId) => { setSelectedDomains(prev => prev.includes(domainId) ? prev.filter(d => d !== domainId) : [...prev, domainId] ); }; const handleTopicToggle = (topicId) => { setSelectedTopics(prev => prev.includes(topicId) ? prev.filter(t => t !== topicId) : [...prev, topicId] ); }; const handlePatternToggle = (patternId) => { setSelectedPatterns(prev => prev.includes(patternId) ? prev.filter(p => p !== patternId) : [...prev, patternId] ); }; const handleResourceToggle = (resourceId) => { setSelectedResources(prev => prev.includes(resourceId) ? prev.filter(r => r !== resourceId) : [...prev, resourceId] ); }; const handleClearFilters = () => { setSelectedDomains([]); setSelectedTopics([]); setSelectedPatterns([]); setSelectedResources([]); setSearchQuery(''); }; const handleBackToHome = () => { setViewMode('home'); setSelectedPersona(null); setSelectedTopic(null); }; // Example decision data - would come from Python export const exampleDecisions = [ { decision_summary: "Approval of $850,000 athletic turf replacement project", outcome: "Approved", primary_rationale: "Athletic facilities are essential for student engagement and community pride. The current turf is beyond its useful life and poses safety concerns.", supporters: [ { name: "Board Member Johnson", role: "Board Member" }, { name: "Athletic Director Smith", role: "Staff" } ], opponents: [ { name: "Parent Coalition Representative", role: "Public Comment" } ], vote_result: "5-2", meeting_date: "2026-03-15", tradeoffs_discussed: ["Capital funding vs. operational needs", "Visibility vs. academic priorities"], evidence_cited: [{ source: "Facility Assessment Report 2025" }], policy_domain: "facilities" }, { decision_summary: "Tabled: West Alabama Community Dental Clinic partnership proposal", outcome: "Deferred", primary_rationale: "Need additional time to review liability implications and insurance coverage requirements before making a final decision.", supporters: [ { name: "Health Department Representative", role: "External Partner" }, { name: "240+ citizen comments", role: "Public Comment" } ], opponents: [], vote_result: "Motion to table: 6-1", meeting_date: "2026-04-10", tradeoffs_discussed: ["Liability concerns vs. student health needs"], evidence_cited: [ { source: "Risk Manager Patricia Johnson memo" }, { source: "Insurance policy documentation" } ], policy_domain: "health" }, { decision_summary: "Contracted health services budget reduction of $120,000", outcome: "Approved as part of budget", primary_rationale: "Administrative cost increases require reallocation from non-critical service contracts. Health screenings can be covered through existing nurse staff.", supporters: [ { name: "CFO Thompson", role: "Staff" }, { name: "Budget Committee", role: "Committee" } ], opponents: [ { name: "School Nurses Association", role: "Public Comment" } ], vote_result: "7-0", meeting_date: "2026-02-20", tradeoffs_discussed: ["Cost savings vs. preventive health services"], evidence_cited: [{ source: "FY2026 Budget Proposal" }], policy_domain: "budget" } ]; // Filter decisions based on search and domains const filteredDecisions = exampleDecisions.filter(decision => { const matchesSearch = searchQuery === '' || decision.decision_summary.toLowerCase().includes(searchQuery.toLowerCase()); const matchesDomain = selectedDomains.length === 0 || selectedDomains.includes(decision.policy_domain); return matchesSearch && matchesDomain; }); const ActiveComponent = tabs[active].component; return (
{metadata.description}
No decisions match your filters
Generated by CommunityOne Open Navigator — Evidence-based advocacy toolkit
Methodology: Accountability dashboards using public meeting records and budget data