File size: 5,135 Bytes
b7cc217
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
Drafts tab for Models view in Video Model Studio UI
"""

import gradio as gr
import logging
from typing import Dict, Any, List, Optional, Tuple
from datetime import datetime

from vms.utils.base_tab import BaseTab

logger = logging.getLogger(__name__)

class DraftsTab(BaseTab):
    """Tab for managing draft models"""
    
    def __init__(self, app_state):
        super().__init__(app_state)
        self.id = "drafts_tab"
        self.title = "Drafts"
    
    def create(self, parent=None) -> gr.TabItem:
        """Create the Drafts tab UI components"""
        with gr.TabItem(self.title, id=self.id) as tab:

            # List for displaying models
            with gr.Column() as models_container:
                self.components["models_container"] = models_container
                self.components["no_models_message"] = gr.Markdown(
                    "No draft models found. Create a new model from the Project tab.",
                    visible=False
                )
                
                # Placeholder for model rows - will be filled dynamically
                self.components["model_rows"] = []
                
                # Initial load of models
                self.refresh_models()
                
        return tab
    
    def connect_events(self) -> None:
        """Connect event handlers to UI components"""
        # Add auto-refresh timer
        refresh_timer = gr.Timer(interval=5)  # Refresh every 5 seconds
        refresh_timer.tick(
            fn=self.refresh_models,
            inputs=[],
            outputs=[self.components["models_container"]]
        )
    
    def refresh_models(self) -> gr.Column:
        """Refresh the list of draft models"""
        # Get models from service
        draft_models = self.app.models_tab.models_service.get_draft_models()
        
        # Create a new Column to replace the existing one
        with gr.Column() as new_container:
            if not draft_models:
                gr.Markdown("No draft models found. Create a new model from the Project tab.")
            else:
                # Create headers
                with gr.Row(equal_height=True):
                    with gr.Column(scale=2, min_width=20):
                        gr.Markdown("### Model ID")
                    with gr.Column(scale=2, min_width=20):
                        gr.Markdown("### Model Type")
                    with gr.Column(scale=1, min_width=20):
                        gr.Markdown("### Created")
                    with gr.Column(scale=2, min_width=20):
                        gr.Markdown("### Actions")
                    
                # Create a row for each model
                for model in draft_models:
                    with gr.Row(equal_height=True):
                        with gr.Column(scale=2, min_width=20):
                            gr.Markdown(model.id[:8] + "...")
                        with gr.Column(scale=2, min_width=20):
                            gr.Markdown(model.model_display_name or "Unknown")
                        with gr.Column(scale=1, min_width=20):
                            gr.Markdown(model.created_at.strftime("%Y-%m-%d"))
                        
                        with gr.Column(scale=2, min_width=20):
                            with gr.Row():
                                with gr.Column(scale=1, min_width=10):
                                    edit_btn = gr.Button("✏️ Edit", size="sm")
                                    # Connect event handlers for this specific model
                                    edit_btn.click(
                                        fn=lambda model_id=model.id: self.edit_model(model_id),
                                        inputs=[],
                                        outputs=[]
                                    )
                                with gr.Column(scale=1, min_width=10):
                                    delete_btn = gr.Button("🗑️ Delete", size="sm", variant="stop")
                                
                                    delete_btn.click(
                                        fn=lambda model_id=model.id: self.delete_model(model_id),
                                        inputs=[],
                                        outputs=[new_container]
                                    )
        
        return new_container
    
    def edit_model(self, model_id: str) -> None:
        """Switch to editing the selected model"""
        if self.app:
            # Switch to project view with this model
            self.app.switch_project(model_id)
            # Set main tab to Project (index 0)
            self.app.switch_to_tab(0)
            
    def delete_model(self, model_id: str) -> gr.Column:
        """Delete a model and refresh the list"""
        if self.app and self.app.models_tab.models_service.delete_model(model_id):
            gr.Info(f"Model {model_id[:8]}... deleted successfully")
        else:
            gr.Warning(f"Failed to delete model {model_id[:8]}...")
            
        # Refresh the models list
        return self.refresh_models()