filters.py
1 """ 2 Reusable Filter Components 3 4 Provides consistent filter widgets across the dashboard. 5 """ 6 7 import streamlit as st 8 from datetime import datetime, timedelta 9 from typing import List, Tuple 10 11 12 def date_range_filter(key: str = "date_range", default_days: int = 30) -> Tuple[datetime, datetime]: 13 """ 14 Display date range filter. 15 16 Args: 17 key: Unique key for this filter 18 default_days: Default number of days to look back 19 20 Returns: 21 Tuple of (start_date, end_date) 22 """ 23 col1, col2 = st.columns(2) 24 with col1: 25 start_date = st.date_input( 26 "Start Date", 27 value=datetime.now() - timedelta(days=default_days), 28 key=f"{key}_start" 29 ) 30 with col2: 31 end_date = st.date_input( 32 "End Date", 33 value=datetime.now(), 34 key=f"{key}_end" 35 ) 36 return start_date, end_date 37 38 39 def channel_multiselect(key: str = "channel", default_all: bool = True) -> List[str]: 40 """ 41 Display channel multi-select filter. 42 43 Args: 44 key: Unique key for this filter 45 default_all: Whether to select all channels by default 46 47 Returns: 48 List of selected channels 49 """ 50 channels = ['sms', 'email', 'form', 'x', 'linkedin'] 51 selected = st.multiselect( 52 "Filter by Channel", 53 options=channels, 54 default=channels if default_all else [], 55 key=key 56 ) 57 return selected 58 59 60 def status_multiselect(key: str = "status", default_all: bool = True) -> List[str]: 61 """ 62 Display pipeline status multi-select filter. 63 64 Args: 65 key: Unique key for this filter 66 default_all: Whether to select all statuses by default 67 68 Returns: 69 List of selected statuses 70 """ 71 statuses = ['pending', 'assets_captured', 'scored', 'rescored', 'enriched', 'proposals_drafted', 'outreach_sent'] 72 selected = st.multiselect( 73 "Filter by Status", 74 options=statuses, 75 default=statuses if default_all else [], 76 key=key 77 ) 78 return selected 79 80 81 def sentiment_multiselect(key: str = "sentiment", default_all: bool = True) -> List[str]: 82 """ 83 Display sentiment multi-select filter. 84 85 Args: 86 key: Unique key for this filter 87 default_all: Whether to select all sentiments by default 88 89 Returns: 90 List of selected sentiments 91 """ 92 sentiments = ['positive', 'neutral', 'negative', 'objection'] 93 selected = st.multiselect( 94 "Filter by Sentiment", 95 options=sentiments, 96 default=sentiments if default_all else [], 97 key=key 98 ) 99 return selected