Spaces:
Sleeping
Sleeping
| """ | |
| 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 | |