File size: 4,332 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
"""
Character Manage Tab for D'n'D Campaign Manager
"""

import gradio as gr
from typing import Tuple
from src.agents.character_agent import CharacterAgent
from src.ui.components.dropdown_manager import DropdownManager


class CharacterManageTab:
    """Manage Characters tab for deleting and viewing characters"""

    def __init__(self, character_agent: CharacterAgent, dropdown_manager: DropdownManager):
        self.character_agent = character_agent
        self.dropdown_manager = dropdown_manager

    def delete_character_ui(self, character_id: str) -> str:
        """Delete character by ID"""
        try:
            if not character_id.strip():
                return "❌ Error: Please provide a character ID"

            # Check if exists
            character = self.character_agent.load_character(character_id)
            if not character:
                return f"❌ Character not found: {character_id}"

            # Delete
            self.character_agent.delete_character(character_id)
            return f"βœ… Deleted character: {character.name} ({character_id})"

        except Exception as e:
            return f"❌ Error deleting character: {e}"

    def list_characters_ui(self) -> Tuple[str, str]:
        """List all saved characters"""
        try:
            characters = self.character_agent.list_characters()

            if not characters:
                return "", "No characters found in database."

            # Create table
            markdown = "# Saved Characters\n\n"
            markdown += "| Name | Race | Class | Level | ID |\n"
            markdown += "|------|------|-------|-------|----|\n"

            for char in characters[-20:]:  # Last 20 characters
                markdown += f"| {char.name} | {char.race.value} | {char.character_class.value} | {char.level} | `{char.id}` |\n"

            status = f"βœ… Found {len(characters)} character(s)"
            return markdown, status

        except Exception as e:
            return "", f"❌ Error listing characters: {e}"

    def create(self) -> gr.Dropdown:
        """Create and return the Manage Characters tab component"""
        with gr.Tab("Manage Characters"):
            gr.Markdown("### Character Management")

            delete_refresh_btn = gr.Button("πŸ”„ Refresh Character List", variant="secondary")

            delete_character_dropdown = gr.Dropdown(
                choices=[],
                label="Select Character to Delete",
                info="⚠️ Warning: This action cannot be undone! (type to search)",
                allow_custom_value=False,
                interactive=True
            )

            delete_btn = gr.Button("πŸ—‘οΈ Delete Character", variant="stop")

            delete_status_output = gr.Textbox(label="Status", lines=3)

            # Refresh delete character dropdown
            delete_refresh_btn.click(
                fn=self.dropdown_manager.refresh_character_dropdown,
                inputs=[],
                outputs=[delete_character_dropdown]
            )

            # Delete character action - convert dropdown label to ID and refresh list
            def delete_character_from_dropdown(label):
                char_id = self.dropdown_manager.get_character_id_from_label(label)
                status = self.delete_character_ui(char_id)
                # Refresh dropdown choices after deletion
                updated_choices = self.dropdown_manager.refresh_character_dropdown()
                return status, updated_choices

            delete_btn.click(
                fn=delete_character_from_dropdown,
                inputs=[delete_character_dropdown],
                outputs=[delete_status_output, delete_character_dropdown]
            )

            gr.Markdown("---")

            with gr.Accordion("Quick Actions", open=False):
                quick_list_btn = gr.Button("πŸ“‹ List All Characters")
                quick_list_output = gr.Markdown(label="Character List")
                quick_status = gr.Textbox(label="Status", lines=2)

                quick_list_btn.click(
                    fn=self.list_characters_ui,
                    inputs=[],
                    outputs=[quick_list_output, quick_status]
                )

        # Return the dropdown for auto-population
        return delete_character_dropdown