Spaces:
Sleeping
Sleeping
| """ | |
| CSH2 Web Analytics Dashboard — DELPHI | |
| Main entry point with multi-page navigation | |
| """ | |
| import streamlit as st | |
| import base64 | |
| from pathlib import Path | |
| st.set_page_config( | |
| page_title="CSH2 // DELPHI", | |
| page_icon="⚙️", | |
| layout="wide", | |
| initial_sidebar_state="expanded", | |
| ) | |
| from ui.styles import inject_custom_css | |
| from core.db_connector import get_db_connector | |
| from ui.components import system_status_footer | |
| # Inject HUD theme CSS | |
| inject_custom_css() | |
| # Initialize DB connection (cached as singleton) | |
| db = get_db_connector() | |
| # Store DB connector in session state for access from pages | |
| if 'db' not in st.session_state: | |
| st.session_state.db = db | |
| def _get_logo_base64(): | |
| """Load logo and encode as base64 for inline display""" | |
| logo_path = Path(__file__).parent / "assets" / "csh2_logo.jpeg" | |
| if not logo_path.exists(): | |
| return None | |
| with open(logo_path, "rb") as f: | |
| return base64.b64encode(f.read()).decode() | |
| def _cached_time_range(): | |
| """Cache the data time range (quasi-static, 1hr TTL)""" | |
| _db = get_db_connector() | |
| return _db.get_time_range() | |
| # Sidebar branding | |
| with st.sidebar: | |
| # Logo with CSS filter for dark background | |
| logo_b64 = _get_logo_base64() | |
| if logo_b64: | |
| st.markdown(f""" | |
| <div style="text-align: center; margin-bottom: 0.5rem; padding-top: 0.5rem;"> | |
| <img src="data:image/jpeg;base64,{logo_b64}" | |
| style="width: 120px; filter: invert(0.85) sepia(0.3) saturate(2) hue-rotate(15deg) brightness(1.1);" /> | |
| </div> | |
| """, unsafe_allow_html=True) | |
| st.markdown( | |
| '<div style="text-align: center; color: #D4A04A; font-size: 0.7rem; letter-spacing: 2px; ' | |
| 'text-transform: uppercase; margin-bottom: 12px;">PUMP ANALYTICS</div>', | |
| unsafe_allow_html=True, | |
| ) | |
| # System status | |
| earliest, latest = _cached_time_range() | |
| system_status_footer( | |
| sensor_count=len(db.tag_cache), | |
| data_start=earliest.strftime('%Y-%m-%d') if earliest else 'N/A', | |
| data_end=latest.strftime('%Y-%m-%d') if latest else 'N/A', | |
| connected=True, | |
| ) | |
| st.markdown('<div style="height: 8px;"></div>', unsafe_allow_html=True) | |
| # Page navigation | |
| data_explorer = st.Page("pages/1_data_explorer.py", title="Data Explorer", default=True) | |
| pump_cycles = st.Page("pages/2_pump_cycles.py", title="Testing Cycles") | |
| cycle_detail = st.Page("pages/3_cycle_detail.py", title="Cycle Detail") | |
| variation_analysis = st.Page("pages/4_variation_analysis.py", title="Variation Analysis") | |
| cycle_comparison = st.Page("pages/5_cycle_comparison.py", title="Cycle Comparison") | |
| advanced_explorer = st.Page("pages/6_advanced_explorer.py", title="Advanced Data Explorer") | |
| search = st.Page("pages/7_search.py", title="Search") | |
| pg = st.navigation([data_explorer, advanced_explorer, pump_cycles, cycle_detail, variation_analysis, cycle_comparison, search]) | |
| pg.run() | |