Spaces:
Sleeping
Sleeping
File size: 5,925 Bytes
71b378e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
"""
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
|