File size: 3,257 Bytes
e562ce4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Policy definition tab UI components."""

import os
import sys

import gradio as gr

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from utils.helpers import load_policy_from_file, load_preset_policy


def build_policy_tab(base_dir: str) -> dict:
    """Build the policy definition tab UI."""
    with gr.Tab("📋 Policy Definition"):
        input_method = gr.Radio(label="Input Method", choices=["Upload Markdown", "Enter Manually", "Select Preset"], value="Select Preset")

        upload_file = gr.File(label="Upload Markdown File", file_types=[".md"], visible=False)
        upload_preview = gr.Textbox(label="File Preview", lines=10, interactive=False, visible=False)
        load_upload_btn = gr.Button("Load Policy", visible=False)

        manual_text = gr.Textbox(label="Policy Text", placeholder="Enter policy markdown...", lines=20, visible=False)
        save_manual_btn = gr.Button("Save Policy", visible=False)

        preset_dropdown = gr.Dropdown(
            label="Select Preset", choices=["Hate Speech Policy", "Violence Policy", "Toxicity Policy"], value="Hate Speech Policy", visible=True
        )
        preset_preview = gr.Markdown(value="*Select a preset to preview*", visible=True)
        load_preset_btn = gr.Button("Load Preset", visible=True)

        gr.Markdown("---")
        gr.Markdown("### Current Policy")
        current_policy = gr.Markdown(value="*No policy loaded*")
        clear_policy_btn = gr.Button("Clear Policy", variant="secondary")

        current_policy_state = gr.State(value="")

        def update_ui(method):
            return (
                gr.update(visible=(method == "Upload Markdown")),
                gr.update(visible=(method == "Upload Markdown")),
                gr.update(visible=(method == "Upload Markdown")),
                gr.update(visible=(method == "Enter Manually")),
                gr.update(visible=(method == "Enter Manually")),
                gr.update(visible=(method == "Select Preset")),
                gr.update(visible=(method == "Select Preset")),
                gr.update(visible=(method == "Select Preset")),
            )

        input_method.change(update_ui, inputs=input_method, outputs=[upload_file, upload_preview, load_upload_btn, manual_text, save_manual_btn, preset_dropdown, preset_preview, load_preset_btn])

        # Policy loading handlers
        load_preset_btn.click(
            lambda name: load_preset_policy(name, base_dir),
            inputs=preset_dropdown,
            outputs=[current_policy_state, current_policy],
        )
        load_upload_btn.click(
            lambda f: load_policy_from_file(f.name) if f else ("", ""),
            inputs=upload_file,
            outputs=[current_policy_state, current_policy],
        )
        upload_file.change(lambda f: open(f.name).read() if f else "", inputs=upload_file, outputs=upload_preview)
        save_manual_btn.click(lambda t: (t, t), inputs=manual_text, outputs=[current_policy_state, current_policy])
        clear_policy_btn.click(lambda: ("", "*No policy loaded*"), outputs=[current_policy_state, current_policy])

    return {
        "current_policy_state": current_policy_state,
        "current_policy": current_policy,
    }