DnD_Campaign_Manager / src /ui /tabs /campaign_manage_tab.py
official.ghost.logic
Deploy D&D Campaign Manager v2
71b378e
"""
Campaign Manage Tab for D'n'D Campaign Manager
"""
import gradio as gr
from typing import Tuple
from src.agents.campaign_agent import CampaignAgent
from src.ui.components.dropdown_manager import DropdownManager
class CampaignManageTab:
"""Manage Campaign tab for viewing and managing campaigns"""
def __init__(self, campaign_agent: CampaignAgent, dropdown_manager: DropdownManager):
self.campaign_agent = campaign_agent
self.dropdown_manager = dropdown_manager
def list_campaigns_ui(self, active_only: bool = False) -> Tuple[str, str]:
"""List all campaigns"""
try:
campaigns = self.campaign_agent.list_campaigns(active_only=active_only)
if not campaigns:
return "", "No campaigns found in database."
# Create table
markdown = "# Campaigns\n\n"
markdown += "| Name | Theme | Session | Status | ID |\n"
markdown += "|------|-------|---------|--------|----|\n"
for campaign in campaigns[-20:]: # Last 20 campaigns
status = "Active" if campaign.is_active else "Inactive"
markdown += f"| {campaign.name} | {campaign.theme.value} | {campaign.current_session} | {status} | `{campaign.id}` |\n"
status = f"βœ… Found {len(campaigns)} campaign(s)"
return markdown, status
except Exception as e:
return "", f"❌ Error listing campaigns: {e}"
def load_campaign_ui(self, campaign_id: str) -> Tuple[str, str]:
"""Load campaign details"""
try:
if not campaign_id.strip():
return "", "❌ Error: Please provide a campaign ID"
campaign = self.campaign_agent.load_campaign(campaign_id)
if campaign:
markdown = campaign.to_markdown()
status = f"βœ… Loaded campaign: {campaign.name}"
return markdown, status
else:
return "", f"❌ Campaign not found: {campaign_id}"
except Exception as e:
return "", f"❌ Error loading campaign: {e}"
def delete_campaign_ui(self, campaign_id: str) -> str:
"""Delete a campaign"""
try:
if not campaign_id.strip():
return "❌ Error: Please select a campaign to delete"
# Load campaign first to get name
campaign = self.campaign_agent.load_campaign(campaign_id)
if not campaign:
return f"❌ Campaign not found: {campaign_id}"
campaign_name = campaign.name
# Delete the campaign
success = self.campaign_agent.delete_campaign(campaign_id)
if success:
return f"""βœ… **Campaign deleted successfully!**
**Campaign:** {campaign_name}
**ID:** {campaign_id}
The campaign and all associated data (events, session notes) have been permanently removed.
πŸ’‘ **Tip:** Refresh the campaign list to see updated campaigns."""
else:
return f"❌ Failed to delete campaign: {campaign_id}"
except Exception as e:
return f"❌ Error deleting campaign: {str(e)}"
def create(self) -> gr.Dropdown:
"""Create and return the Manage Campaign tab component"""
with gr.Tab("Manage Campaign"):
gr.Markdown("### Manage Campaign")
manage_campaign_refresh_btn = gr.Button("πŸ”„ Refresh Campaign List", variant="secondary")
manage_campaign_dropdown = gr.Dropdown(
choices=[],
label="Select Campaign",
info="Choose a campaign to view (type to search)",
allow_custom_value=False,
interactive=True
)
with gr.Row():
load_campaign_btn = gr.Button("πŸ“‚ Load Campaign", variant="primary")
list_campaigns_btn = gr.Button("πŸ“‹ List All Campaigns")
delete_campaign_btn = gr.Button("πŸ—‘οΈ Delete Campaign", variant="stop")
gr.Markdown("---")
with gr.Row():
campaign_details = gr.Markdown(label="Campaign Details")
campaign_status = gr.Textbox(label="Status", lines=6)
# Refresh campaign dropdown
manage_campaign_refresh_btn.click(
fn=self.dropdown_manager.refresh_campaign_dropdown,
inputs=[],
outputs=[manage_campaign_dropdown]
)
# Load campaign - convert dropdown label to ID
def load_campaign_from_dropdown(label):
campaign_id = self.dropdown_manager.get_campaign_id_from_label(label)
return self.load_campaign_ui(campaign_id)
load_campaign_btn.click(
fn=load_campaign_from_dropdown,
inputs=[manage_campaign_dropdown],
outputs=[campaign_details, campaign_status]
)
list_campaigns_btn.click(
fn=self.list_campaigns_ui,
inputs=[],
outputs=[campaign_details, campaign_status]
)
# Delete campaign - convert dropdown label to ID and refresh list
def delete_campaign_from_dropdown(label):
campaign_id = self.dropdown_manager.get_campaign_id_from_label(label)
status = self.delete_campaign_ui(campaign_id)
# Refresh dropdown choices after deletion
updated_choices = self.dropdown_manager.refresh_campaign_dropdown()
return status, updated_choices
delete_campaign_btn.click(
fn=delete_campaign_from_dropdown,
inputs=[manage_campaign_dropdown],
outputs=[campaign_status, manage_campaign_dropdown]
)
# Return the dropdown for auto-population
return manage_campaign_dropdown