File size: 5,034 Bytes
02daacc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
UI Helpers Module
Helper functions for Gradio UI interactions.
"""
import json
import gradio as gr

from .file_manager import (
    get_folder_contents, get_breadcrumb, get_status, get_quick_access_folders,
    create_folder, create_file, delete_item, rename_item, write_file,
    navigate_to_folder, get_file_preview
)
from .events import event_manager
from .logger import logger
from .api import api_create_event, api_delete_event, api_toggle_event, api_run_event


def ui_result(result_str: str) -> str:
    """Parse result JSON and return status message"""
    try:
        r = json.loads(result_str)
        return "βœ… Success" if r.get("success") else f"❌ {r.get('error', 'Error')}"
    except:
        return result_str


def ui_create_folder(name):
    result = create_folder(name)
    return get_folder_contents(), get_breadcrumb(), ui_result(result), get_quick_access_folders()


def ui_create_file(name, content):
    result = create_file(name, content)
    return get_folder_contents(), get_breadcrumb(), ui_result(result), get_quick_access_folders()


def ui_delete(name):
    if not name:
        return get_folder_contents(), get_breadcrumb(), "⚠️ Select item", get_quick_access_folders()
    result = delete_item(name)
    return get_folder_contents(), get_breadcrumb(), ui_result(result), get_quick_access_folders()


def ui_rename(old, new):
    result = rename_item(old, new)
    return get_folder_contents(), get_breadcrumb(), ui_result(result), get_quick_access_folders()


def ui_save(name, content):
    if not name:
        return "⚠️ Select file"
    result = write_file(name, content)
    return ui_result(result)


def on_folder_tree_select(evt: gr.SelectData, data):
    """Handle folder tree selection"""
    if evt.index[0] < len(data):
        folder_path = data[evt.index[0]][2]
        return navigate_to_folder(folder_path)
    return get_folder_contents(), get_breadcrumb(), get_status(), get_quick_access_folders()


def navigate_from_main(evt: gr.SelectData, data):
    """Handle click on main content - navigate into folder or show preview"""
    from .file_manager import current_path
    import modules.file_manager as fm

    if evt.index[0] < len(data):
        name = data[evt.index[0]][1]
        item_type = data[evt.index[0]][2]

        if item_type == "Folder":
            new_path = fm.current_path / name
            if new_path.exists() and new_path.is_dir():
                fm.current_path = new_path
                return (
                    get_folder_contents(),
                    get_breadcrumb(),
                    get_status(),
                    get_quick_access_folders(),
                    name,
                    None, "", ""
                )
        else:
            img, txt, info = get_file_preview(name)
            return (
                data,
                get_breadcrumb(),
                get_status(),
                get_quick_access_folders(),
                name,
                img, txt or "", info
            )

    return (data, get_breadcrumb(), get_status(), get_quick_access_folders(), "", None, "", "")


# Event UI helpers
def get_events_table():
    events = event_manager.get_events()
    rows = []
    for e in events:
        rows.append([
            e["event_id"],
            e["event_type"],
            e["target_path"][:30] + "..." if len(e["target_path"]) > 30 else e["target_path"],
            f"{e['interval_hours']}h",
            "βœ…" if e["enabled"] else "❌",
            e.get("last_run", "Never")[:16] if e.get("last_run") else "Never",
            str(e["run_count"])
        ])
    return rows


def get_logs_display(log_type: str = "all", limit: int = 50):
    logs = logger.get_logs(log_type, limit)
    if not logs:
        return "No logs found"

    lines = []
    for log in logs:
        level_icon = {"INFO": "ℹ️", "ERROR": "❌", "WARNING": "⚠️", "EVENT": "πŸ“Œ", "DEBUG": "πŸ”"}.get(log["level"], "β€’")
        lines.append(f"[{log['timestamp'][:19]}] {level_icon} [{log['category']}] {log['message']}")
    return "\n".join(lines)


def ui_create_event(event_type, target_path, interval_hours, enabled, description):
    result = api_create_event(event_type, target_path, interval_hours, enabled, description)
    return get_events_table(), ui_result(result)


def ui_delete_event(event_id):
    result = api_delete_event(event_id)
    return get_events_table(), ui_result(result)


def ui_toggle_event(event_id):
    result = api_toggle_event(event_id)
    return get_events_table(), ui_result(result)


def ui_run_event(event_id):
    result = api_run_event(event_id)
    return get_events_table(), get_logs_display("events", 20), ui_result(result)


def ui_refresh_logs(log_type, limit):
    return get_logs_display(log_type, int(limit))


def ui_clear_logs(log_type):
    from .api import api_clear_logs
    api_clear_logs(log_type)
    return get_logs_display(log_type, 50), "βœ… Logs cleared"


def ui_copy_logs(log_type):
    return logger.export_logs(log_type)