# ui/renderers.py
from datetime import datetime
from config import AGENTS_INFO
def _format_iso_time(iso_str: str) -> str:
if not iso_str or iso_str == "N/A": return ""
try:
dt = datetime.fromisoformat(iso_str)
return dt.strftime("%H:%M")
except Exception:
if "T" in iso_str: return iso_str.split("T")[1][:5]
return iso_str
def create_agent_stream_output(text: str = None) -> str:
return f'
{text}
'
def create_agent_dashboard(status_dict: dict) -> str:
leader_key = 'team'
member_keys = ['scout', 'weatherman', 'optimizer', 'navigator', 'presenter']
def _render_card(key):
info = AGENTS_INFO.get(key, {})
state = status_dict.get(key, {})
status = state.get('status', 'idle')
msg = state.get('message', 'Standby')
active_class = "working" if status == "working" else ""
icon = info.get('icon', '🤖')
name = info.get('name', key.title())
role = info.get('role', 'Agent')
color = info.get('color', '#6366f1')
return f"""
{icon}
{name}
{role}
{msg}
"""
html = f"""
{_render_card(leader_key)}
{''.join([_render_card(k) for k in member_keys])}
"""
return html
def create_summary_card(total_tasks: int, high_priority: int, total_time: int, location: str = "Taipei City",
date: str = "Today") -> str:
return f"""
TRIP SUMMARY
{location}
📅 {date}
Duration
{total_time} min
High Prio
{high_priority}
"""
def create_task_card(task_num: int, task_title: str, priority: str, time_window: dict, duration: str, location: str,
icon: str = "📋") -> str:
p_color = {"HIGH": "#ef4444", "MEDIUM": "#f59e0b", "LOW": "#10b981"}.get(priority.upper(), "#94a3b8")
display_time = "Anytime"
if isinstance(time_window, dict):
s_clean = _format_iso_time(time_window.get('earliest_time', ''))
e_clean = _format_iso_time(time_window.get('latest_time', ''))
if s_clean and e_clean:
display_time = f"{s_clean} - {e_clean}"
elif s_clean:
display_time = f"After {s_clean}"
elif time_window:
display_time = str(time_window)
return f"""
{icon}
{task_title}
{priority}
📍 {location}
🕒 {display_time} | ⏳ {duration}
"""
# 🔥🔥🔥 Updated Timeline Function
def create_timeline_html_enhanced(timeline):
if not timeline:
return """
No timeline data available yet.
"""
html = ''
for i, stop in enumerate(timeline):
location = stop.get('location', 'Unknown')
time_str = stop.get('time', '')
if not time_str or time_str == "N/A": time_str = "Flexible Time"
weather_str = stop.get('weather', '')
weather_html = ""
if weather_str and weather_str != "N/A":
weather_html = f'
🌤️ {weather_str}
'
html += f"""
"""
html += '
'
return html
# Empty Placeholders
def create_metrics_cards(metrics, traffic): return ""
def create_result_visualization(tasks, data): return ""
def generate_chat_history_html_bubble(session): return ""