File size: 15,919 Bytes
1906fa8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
# dataset_editor_interface.py
"""
Dataset Editor Interface for Enhanced Datasets.

Provides a standalone interface for editing test datasets with full CRUD operations.
"""

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

from src.core.verification_models import TestMessage, TestDataset
from src.interface.enhanced_dataset_interface import EnhancedDatasetInterfaceController


def create_dataset_editor_interface() -> gr.Blocks:
    """
    Create the dataset editor interface.
    
    Returns:
        Gradio Blocks component for dataset editing
    """
    with gr.Blocks(title="Edit Enhanced Datasets") as interface:
        # Initialize controller
        dataset_controller = EnhancedDatasetInterfaceController()
        
        # Pre-load dataset choices for initialization
        try:
            initial_choices, _, _, _ = dataset_controller.initialize_interface()
        except Exception:
            initial_choices = []
        
        # Application state
        current_dataset_state = gr.State(value=None)
        editing_dataset_state = gr.State(value=None)
        
        # Header
        gr.Markdown("# ✏️ Edit Enhanced Datasets")
        gr.Markdown("Manage and customize test datasets for verification. Add, modify, or delete test cases to create datasets tailored to your testing needs.")
        
        # Dataset selection interface
        with gr.Row():
            with gr.Column(scale=2):
                gr.Markdown("## πŸ“‹ Select Dataset")
                
                dataset_selector = gr.Dropdown(
                    choices=initial_choices,
                    value=initial_choices[0] if initial_choices else None,
                    label="Available Datasets",
                    info="Choose a dataset to edit",
                    interactive=True
                )
                
                with gr.Row():
                    edit_dataset_btn = gr.Button("✏️ Edit Dataset", variant="primary", scale=2)
                    create_dataset_btn = gr.Button("βž• Create New Dataset", variant="secondary", scale=1)
            
            with gr.Column(scale=1):
                gr.Markdown("## πŸ“Š Dataset Information")
                dataset_info_display = gr.Markdown(
                    "Select a dataset to view details",
                    label="Dataset Details"
                )
        
        # Create new dataset section (initially hidden)
        create_section = gr.Row(visible=False)
        with create_section:
            with gr.Column():
                gr.Markdown("## βž• Create New Dataset")
                
                with gr.Row():
                    with gr.Column(scale=2):
                        new_dataset_name = gr.Textbox(
                            label="Dataset Name",
                            placeholder="Enter dataset name...",
                            interactive=True
                        )
                    with gr.Column(scale=2):
                        new_dataset_description = gr.Textbox(
                            label="Description",
                            placeholder="Describe the dataset purpose...",
                            interactive=True
                        )
                    with gr.Column(scale=1):
                        template_selector = gr.Dropdown(
                            choices=["", "empty", "mixed_sample"],
                            label="Template",
                            value="",
                            info="Optional template"
                        )
                
                with gr.Row():
                    create_confirm_btn = gr.Button("βœ… Create Dataset", variant="primary")
                    create_cancel_btn = gr.Button("❌ Cancel", variant="secondary")
        
        # Edit Dataset interface (initially hidden)
        edit_section = gr.Row(visible=False)
        with edit_section:
            with gr.Column():
                gr.Markdown("## ✏️ Edit Dataset")
                
                # Dataset actions
                with gr.Row():
                    save_dataset_btn = gr.Button("πŸ’Ύ Save Changes", variant="primary")
                    close_edit_btn = gr.Button("βœ–οΈ Close Editor", variant="secondary")
                
                # Test cases display
                test_cases_display = gr.HTML(
                    value="<p>Loading test cases...</p>",
                    label="Test Cases"
                )
                
                gr.Markdown("### βž• Add New Test Case")
                with gr.Row():
                    with gr.Column(scale=3):
                        new_message_text = gr.Textbox(
                            label="Message Text",
                            placeholder="Enter the test message...",
                            lines=3,
                            interactive=True
                        )
                    with gr.Column(scale=1):
                        new_message_classification = gr.Radio(
                            choices=["green", "yellow", "red"],
                            label="Expected Classification",
                            value="yellow"
                        )
                
                with gr.Row():
                    add_test_case_btn = gr.Button("βž• Add Test Case", variant="primary")
                    clear_form_btn = gr.Button("πŸ—‘οΈ Clear Form", variant="secondary")
        
        # Status message
        status_message = gr.Markdown("", visible=True)
        
        # Event handlers
        def on_dataset_selection_change(dataset_selection):
            """Handle dataset selection change."""
            try:
                dataset_info, dataset_obj = dataset_controller.get_dataset_info(dataset_selection)
                return (
                    dataset_info,     # dataset_info_display
                    dataset_obj       # current_dataset_state
                )
            except Exception as e:
                return (
                    f"❌ Error loading dataset info: {str(e)}",  # dataset_info_display
                    None  # current_dataset_state
                )
        
        def on_edit_dataset(current_dataset):
            """Handle edit dataset button."""
            try:
                if not current_dataset:
                    return (
                        gr.Row(visible=False),  # edit_section
                        "",  # test_cases_display
                        current_dataset,  # editing_dataset_state
                        "❌ No dataset selected for editing"  # status_message
                    )
                
                # Render test cases HTML
                test_cases_html = dataset_controller.render_test_cases_display(current_dataset)
                
                return (
                    gr.Row(visible=True),  # edit_section
                    test_cases_html,  # test_cases_display
                    current_dataset,  # editing_dataset_state
                    f"✏️ Editing dataset: '{current_dataset.name}'"  # status_message
                )
            except Exception as e:
                return (
                    gr.Row(visible=False),  # edit_section
                    "",  # test_cases_display
                    None,  # editing_dataset_state
                    f"❌ Error accessing dataset for editing: {str(e)}"  # status_message
                )
        
        def on_close_edit():
            """Close the edit section."""
            return (
                gr.Row(visible=False),  # edit_section
                "",  # new_message_text (clear)
                "yellow",  # new_message_classification (reset)
                "βœ… Editor closed"  # status_message
            )
        
        def on_show_create():
            """Show create dataset section."""
            return (
                gr.Row(visible=True),  # create_section
                "βž• Create a new dataset"  # status_message
            )
        
        def on_cancel_create():
            """Cancel create dataset."""
            return (
                gr.Row(visible=False),  # create_section
                "",  # new_dataset_name (clear)
                "",  # new_dataset_description (clear)
                "",  # template_selector (reset)
                "❌ Dataset creation cancelled"  # status_message
            )
        
        def on_create_dataset(name, description, template):
            """Create a new dataset."""
            try:
                success, message, new_dataset = dataset_controller.create_new_dataset(
                    name, description, template if template else None
                )
                
                if success:
                    # Refresh dataset choices
                    updated_choices, _, _, _ = dataset_controller.initialize_interface()
                    
                    return (
                        gr.Row(visible=False),  # create_section
                        gr.update(choices=updated_choices, value=f"{new_dataset.name} ({new_dataset.message_count} messages)"),  # dataset_selector
                        "",  # new_dataset_name (clear)
                        "",  # new_dataset_description (clear)
                        "",  # template_selector (reset)
                        new_dataset,  # current_dataset_state
                        message  # status_message
                    )
                else:
                    return (
                        gr.Row(visible=True),  # create_section (keep visible)
                        gr.update(),  # dataset_selector (no change)
                        name,  # new_dataset_name (keep)
                        description,  # new_dataset_description (keep)
                        template,  # template_selector (keep)
                        None,  # current_dataset_state
                        message  # status_message
                    )
            except Exception as e:
                return (
                    gr.Row(visible=True),  # create_section (keep visible)
                    gr.update(),  # dataset_selector (no change)
                    name,  # new_dataset_name (keep)
                    description,  # new_dataset_description (keep)
                    template,  # template_selector (keep)
                    None,  # current_dataset_state
                    f"❌ Error creating dataset: {str(e)}"  # status_message
                )
        
        def on_add_test_case(editing_dataset, message_text, classification):
            """Add a new test case to the dataset."""
            try:
                if not editing_dataset:
                    return (
                        "",  # test_cases_display
                        editing_dataset,  # editing_dataset_state
                        message_text,  # new_message_text (keep)
                        classification,  # new_message_classification (keep)
                        "❌ No dataset being edited"  # status_message
                    )
                
                if not message_text or not message_text.strip():
                    return (
                        dataset_controller.render_test_cases_display(editing_dataset),  # test_cases_display
                        editing_dataset,  # editing_dataset_state
                        message_text,  # new_message_text (keep)
                        classification,  # new_message_classification (keep)
                        "❌ Message text is required"  # status_message
                    )
                
                # Add test case
                success, message, updated_dataset = dataset_controller.add_test_case(
                    editing_dataset, message_text.strip(), classification
                )
                
                if success:
                    # Render updated test cases
                    test_cases_html = dataset_controller.render_test_cases_display(updated_dataset)
                    return (
                        test_cases_html,  # test_cases_display
                        updated_dataset,  # editing_dataset_state
                        "",  # new_message_text (clear)
                        "yellow",  # new_message_classification (reset)
                        message  # status_message
                    )
                else:
                    return (
                        dataset_controller.render_test_cases_display(editing_dataset),  # test_cases_display
                        editing_dataset,  # editing_dataset_state
                        message_text,  # new_message_text (keep)
                        classification,  # new_message_classification (keep)
                        message  # status_message
                    )
            except Exception as e:
                return (
                    "",  # test_cases_display
                    editing_dataset,  # editing_dataset_state
                    message_text,  # new_message_text (keep)
                    classification,  # new_message_classification (keep)
                    f"❌ Error adding test case: {str(e)}"  # status_message
                )
        
        def on_clear_form():
            """Clear the add test case form."""
            return (
                "",  # new_message_text
                "yellow",  # new_message_classification
                "πŸ—‘οΈ Form cleared"  # status_message
            )
        
        def on_save_dataset(editing_dataset):
            """Save the current dataset."""
            try:
                if not editing_dataset:
                    return "❌ No dataset being edited"
                
                success, message = dataset_controller.save_dataset(editing_dataset)
                return message
            except Exception as e:
                return f"❌ Error saving dataset: {str(e)}"
        
        # Bind event handlers
        dataset_selector.change(
            on_dataset_selection_change,
            inputs=[dataset_selector],
            outputs=[dataset_info_display, current_dataset_state]
        )
        
        edit_dataset_btn.click(
            on_edit_dataset,
            inputs=[current_dataset_state],
            outputs=[edit_section, test_cases_display, editing_dataset_state, status_message]
        )
        
        create_dataset_btn.click(
            on_show_create,
            outputs=[create_section, status_message]
        )
        
        create_cancel_btn.click(
            on_cancel_create,
            outputs=[create_section, new_dataset_name, new_dataset_description, template_selector, status_message]
        )
        
        create_confirm_btn.click(
            on_create_dataset,
            inputs=[new_dataset_name, new_dataset_description, template_selector],
            outputs=[create_section, dataset_selector, new_dataset_name, new_dataset_description, template_selector, current_dataset_state, status_message]
        )
        
        close_edit_btn.click(
            on_close_edit,
            outputs=[edit_section, new_message_text, new_message_classification, status_message]
        )
        
        add_test_case_btn.click(
            on_add_test_case,
            inputs=[editing_dataset_state, new_message_text, new_message_classification],
            outputs=[test_cases_display, editing_dataset_state, new_message_text, new_message_classification, status_message]
        )
        
        clear_form_btn.click(
            on_clear_form,
            outputs=[new_message_text, new_message_classification, status_message]
        )
        
        save_dataset_btn.click(
            on_save_dataset,
            inputs=[editing_dataset_state],
            outputs=[status_message]
        )
    
    return interface