diff --git a/src/holoviz_mcp/display_mcp/pages/feed_page.py b/src/holoviz_mcp/display_mcp/pages/feed_page.py
index 46fe916..f03653c 100644
--- a/src/holoviz_mcp/display_mcp/pages/feed_page.py
+++ b/src/holoviz_mcp/display_mcp/pages/feed_page.py
@@ -22,6 +22,16 @@ def feed_page():
# Create chat feed
chat_feed = pn.Column(sizing_mode="stretch_both")
+ def on_delete(snippet_id):
+ """Handle deletion of a visualization."""
+ # Delete from database
+ get_db().delete_snippet(snippet_id)
+ # Remove from cache
+ if snippet_id in pn.state.cache["views"]:
+ del pn.state.cache["views"][snippet_id]
+ # Refresh feed
+ update_chat()
+
def get_view(req):
"""Create view for a single visualization in the feed."""
if req.id in pn.state.cache["views"]:
@@ -35,7 +45,7 @@ def get_view(req):
title = f"""\
**{req.name or req.id}** ({created_at})\n\n{req.description}\n
"""
- iframe = f"""
+ iframe = f"""
"""
# Create copy button with JavaScript callback
@@ -66,9 +76,31 @@ def get_view(req):
""",
)
+ delete_button = pn.widgets.Button(
+ name="🗑️ Delete",
+ button_type="danger",
+ width=120,
+ description="Delete this visualization",
+ )
+ delete_button.on_click(lambda event: on_delete(req.id))
+
with pn.config.set(sizing_mode="stretch_width"):
message = pn.Column(
- pn.pane.Markdown(title), pn.pane.Markdown(iframe), pn.Row(pn.HSpacer(), open_button, copy_button, margin=(0, 10, 0, 10), align="end")
+ pn.pane.Markdown(
+ title,
+ margin=(10, 10, 0, 10),
+ ),
+ pn.Tabs(
+ pn.pane.Markdown(iframe, name="View"),
+ pn.widgets.CodeEditor(
+ value=req.app,
+ name="Code",
+ language="python",
+ theme="github_dark",
+ ),
+ margin=(0, 10, 10, 10),
+ ),
+ pn.Row(pn.HSpacer(), open_button, copy_button, delete_button, margin=(0, 10, 0, 10), align="end"),
)
pn.state.cache["views"][req.id] = message