import dash from dash import callback, Input, Output, State, html import dash_bootstrap_components as dbc class InteractionCallbacks: def __init__(self): self._register_callbacks() def _register_callbacks(self): @callback( Output("point-details", "children"), Input("embedding-plot", "clickData"), [State("processed-data", "data"), State("processed-prompts", "data")], ) def display_click_data(clickData, data, prompts_data): if not clickData or not data: return "Click on a point to see details" point_data = clickData["points"][0] trace_name = point_data.get("fullData", {}).get("name", "Documents") if "pointIndex" in point_data: point_index = point_data["pointIndex"] elif "pointNumber" in point_data: point_index = point_data["pointNumber"] else: return "Could not identify clicked point" if ( trace_name.startswith("Prompts") and prompts_data and "prompts" in prompts_data ): item = prompts_data["prompts"][point_index] item_type = "Prompt" else: item = data["documents"][point_index] item_type = "Document" return self._create_detail_card(item, item_type) @callback( [ Output("processed-data", "data", allow_duplicate=True), Output("processed-prompts", "data", allow_duplicate=True), Output("point-details", "children", allow_duplicate=True), ], Input("reset-button", "n_clicks"), prevent_initial_call=True, ) def reset_data(n_clicks): if n_clicks is None or n_clicks == 0: return dash.no_update, dash.no_update, dash.no_update return None, None, "Click on a point to see details" @staticmethod def _create_detail_card(item, item_type): return dbc.Card( [ dbc.CardBody( [ html.H5(f"{item_type}: {item['id']}", className="card-title"), html.P(f"Text: {item['text']}", className="card-text"), html.P( f"Category: {item.get('category', 'Unknown')}", className="card-text", ), html.P( f"Subcategory: {item.get('subcategory', 'Unknown')}", className="card-text", ), html.P( f"Tags: {', '.join(item.get('tags', [])) if item.get('tags') else 'None'}", className="card-text", ), html.P(f"Type: {item_type}", className="card-text text-muted"), ] ) ] )