# UI COMPONENTS MODULE
import gradio as gr
import logging
from datetime import datetime
from modules.utils import ErrorManager, SystemState
# Configure logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger('ui_components')
def create_error_alert():
"""Create the error alert UI component"""
with gr.Blocks() as error_container:
# Hidden error alert that will be shown when errors occur
error_display = gr.HTML(
value="",
visible=False,
elem_id="error-alert",
elem_classes="error-alert-component"
)
# CSS for error styling
gr.HTML("""
""")
# JavaScript for interactive behavior
gr.HTML("""
""")
def update_error_display(error_obj):
"""Update the error display with an error object"""
if not error_obj:
return gr.HTML.update(value="", visible=False)
# Format the error as HTML
error_html = f"""
⚠️ {error_obj['type']} in {error_obj['module'] or 'Unknown Module'}
Error: {error_obj['message']}
Time: {error_obj['timestamp']}
Show Technical Details
{error_obj['details'] if error_obj['details'] else 'No additional details available'}
"""
# Update the display
return gr.HTML.update(value=error_html, visible=True)
# Register the update function to be called when errors occur
ErrorManager().add_listener(lambda err: error_display.update(update_error_display(err)))
return error_container
def create_status_bar():
"""Create a status bar showing system status"""
system_state = SystemState()
with gr.Row(elem_classes="status-bar") as status_bar:
gr.HTML("""
""")
with gr.Column(scale=1):
status_indicator = gr.HTML(
value=f"""
System {'Online' if system_state.online else 'Offline'}
"""
)
with gr.Column(scale=1):
mode_indicator = gr.HTML(
value=f"""
Mode: {'Demo' if system_state.demo_mode else 'Production'}
{' | Debug: On' if system_state.debug_mode else ''}
"""
)
with gr.Column(scale=1):
time_indicator = gr.HTML(
value=f"""
Current Time: {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
"""
)
# Hidden refresh buttons that get triggered by JavaScript
with gr.Row(visible=False):
status_refresh_btn = gr.Button("Refresh Status", elem_id="status_refresh_btn")
mode_refresh_btn = gr.Button("Refresh Mode", elem_id="mode_refresh_btn")
time_refresh_btn = gr.Button("Refresh Time", elem_id="time_refresh_btn")
# Connect refresh buttons to update functions
status_refresh_btn.click(
lambda: gr.HTML.update(value=f"""
System {'Online' if SystemState().online else 'Offline'}