""" 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