import gradio as gr import traceback from typing import Optional, Dict, List from history_manager import UserHistoryManager class SearchHistoryComponent: def __init__(self): """初始化搜索歷史組件""" self.history_manager = UserHistoryManager() def format_history_html(self, history_data: Optional[List[Dict]] = None) -> str: try: if history_data is None: history_data = self.history_manager.get_history() if not history_data: return """

No search history yet. Try making some breed recommendations!

""" html = "
" # 對歷史記錄進行反轉,最新的顯示在前面 for entry in reversed(history_data): timestamp = entry.get('timestamp', 'Unknown time') search_type = entry.get('search_type', 'criteria') results = entry.get('results', []) # 確保我們有結果資料 # 顯示時間戳記和搜尋類型 html += f"""
🕒 {timestamp} Search History
""" # 顯示搜尋參數 if search_type == "criteria": prefs = entry.get('preferences', {}) html += f"""

Search Parameters:

  • Living Space: {prefs.get('living_space', 'N/A')}
  • Exercise Time: {prefs.get('exercise_time', 'N/A')} minutes
  • Grooming: {prefs.get('grooming_commitment', 'N/A')}
  • Size Preference: {prefs.get('size_preference', 'N/A')}
  • Experience: {prefs.get('experience_level', 'N/A')}
  • Children at Home: {"Yes" if prefs.get('has_children') else "No"}
  • Noise Tolerance: {prefs.get('noise_tolerance', 'N/A')}
""" # 關鍵修改:確保結果部分始終顯示 if results: # 只有在有結果時才顯示結果區域 html += """

Top 15 Breed Matches:

""" # 顯示每個推薦結果 for i, result in enumerate(results[:15], 1): breed = result.get('breed', 'Unknown breed') score = result.get('overall_score', 0) # 改用 overall_score if isinstance(score, (int, float)): # 確保分數是數字 score = float(score) * 100 # 轉換為百分比 html += f"""
#{i} {breed.replace('_', ' ')} {score:.1f}%
""" html += """
""" html += "
" # 關閉 history-entry div html += "
" # 關閉 history-container div return html except Exception as e: print(f"Error formatting history: {str(e)}") print(traceback.format_exc()) return f"""
Error formatting history. Please try refreshing the page.
Error details: {str(e)}
""" def clear_history(self) -> str: """清除所有搜尋歷史""" try: success = self.history_manager.clear_all_history() print(f"Clear history result: {success}") return self.format_history_html() except Exception as e: print(f"Error in clear_history: {str(e)}") print(traceback.format_exc()) return "Error clearing history" def refresh_history(self) -> str: """刷新歷史記錄顯示""" try: return self.format_history_html() except Exception as e: print(f"Error in refresh_history: {str(e)}") return "Error refreshing history" def save_search(self, user_preferences: Optional[dict] = None, results: list = None, search_type: str = "criteria", description: str = None) -> bool: """保存搜索結果 Args: user_preferences: 使用者偏好設定 (僅用於criteria搜尋) results: 推薦結果列表 search_type: 搜尋類型 ("criteria" 或 "description") description: 使用者輸入的描述 (僅用於description搜尋) """ return self.history_manager.save_history( user_preferences=user_preferences, results=results, search_type='criteria', ) def create_history_component(): """只創建實例""" return SearchHistoryComponent() def create_history_tab(history_component: SearchHistoryComponent): """創建歷史紀錄的頁面 Args: history_component: """ with gr.TabItem("Recommendation Search History"): gr.HTML("""

Search History

View your previous breed recommendations and search preferences

""") with gr.Row(): with gr.Column(scale=4): history_display = gr.HTML() with gr.Row(): with gr.Column(scale=1): clear_history_btn = gr.Button( "🗑️ Clear History", variant="secondary", size="sm" ) with gr.Column(scale=1): refresh_btn = gr.Button( "🔄 Refresh", variant="secondary", size="sm" ) history_display.value = history_component.format_history_html() clear_history_btn.click( fn=history_component.clear_history, outputs=[history_display], api_name="clear_history" ) refresh_btn.click( fn=history_component.refresh_history, outputs=[history_display], api_name="refresh_history" )