/ dashboard / components / filters.py
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