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