Spaces:
Sleeping
Sleeping
import gradio as gr | |
import os | |
import json | |
import random | |
# Directory to store submissions | |
DATA_DIR = "submissions" | |
os.makedirs(DATA_DIR, exist_ok=True) | |
# Predefined task types | |
TASK_TYPES = ["Classification", "Regression", "Translation"] | |
# Colors for task cards | |
CARD_COLORS = ["#FFDDC1", "#FFABAB", "#FFC3A0", "#D5AAFF", "#85E3FF", "#B9FBC0"] | |
# Function to handle task submission | |
def submit_task(task_type, description, yaml_text): | |
if not yaml_text.strip(): | |
return "YAML/Text input cannot be empty." | |
# Prepare data | |
data = { | |
"task_type": task_type, | |
"description": description, | |
"yaml": yaml_text | |
} | |
file_path = os.path.join(DATA_DIR, f"{task_type}_{len(os.listdir(DATA_DIR))}.json") | |
try: | |
with open(file_path, "w") as f: | |
json.dump(data, f) | |
print(f"Saved file: {file_path}, Contents: {data}") # Debug line | |
return f"Task submitted successfully under type '{task_type}'!" | |
except Exception as e: | |
return f"Error saving task: {e}" | |
# Function to get tasks by type | |
def get_tasks_by_type(task_type): | |
tasks = [] | |
for file in os.listdir(DATA_DIR): | |
# Skip non-JSON files | |
if not file.endswith(".json"): | |
continue | |
try: | |
with open(os.path.join(DATA_DIR, file), "r") as f: | |
data = json.load(f) | |
print(f"File: {file}, Content: {data}") # Debug line | |
# Filter by task type | |
if data.get("task_type") == task_type: | |
tasks.append(data) | |
except (json.JSONDecodeError, KeyError) as e: | |
print(f"Error reading file {file}: {e}") # Debug line | |
return tasks | |
# Function to dynamically add a new task type | |
def add_new_task_type(new_type): | |
if new_type and new_type not in TASK_TYPES: | |
TASK_TYPES.append(new_type) | |
return gr.update(choices=TASK_TYPES), f"Task type '{new_type}' added successfully!" | |
return gr.update(choices=TASK_TYPES), "Task type already exists or invalid input." | |
# Function to switch tabs | |
def switch_tab(tab_name): | |
return gr.Tabs.update(visible_tab=tab_name) | |
# Function to display tasks as clickable cards with modal popups | |
def display_tasks(task_type): | |
tasks = get_tasks_by_type(task_type) | |
html_content = """ | |
<style> | |
.modal {{ | |
display: none; | |
position: fixed; | |
z-index: 1; | |
left: 0; | |
top: 0; | |
width: 100%; | |
height: 100%; | |
overflow: auto; | |
background-color: rgba(0,0,0,0.4); | |
}} | |
.modal-content {{ | |
background-color: #fefefe; | |
margin: 15% auto; | |
padding: 20px; | |
border: 1px solid #888; | |
width: 80%; | |
border-radius: 10px; | |
}} | |
.close {{ | |
color: #aaa; | |
float: right; | |
font-size: 28px; | |
font-weight: bold; | |
}} | |
.close:hover, | |
.close:focus {{ | |
color: black; | |
text-decoration: none; | |
cursor: pointer; | |
}} | |
</style> | |
""" | |
html_content += "<div style='display: flex; flex-wrap: wrap; gap: 10px;'>" | |
for idx, task in enumerate(tasks): | |
color = random.choice(CARD_COLORS) | |
html_content += f""" | |
<div style='background-color: {color}; padding: 10px; border-radius: 5px; cursor: pointer;' onclick="document.getElementById('modal-{idx}').style.display='block';"> | |
<b>{task['description']}</b> | |
</div> | |
<div id='modal-{idx}' class='modal'> | |
<div class='modal-content'> | |
<span class='close' onclick="document.getElementById('modal-{idx}').style.display='none';">×</span> | |
<b>Task Type:</b> {task['task_type']}<br> | |
<b>Description:</b> {task['description']}<br> | |
<b>YAML/Text:</b><pre>{task['yaml']}</pre> | |
</div> | |
</div> | |
""" | |
html_content += "</div>" | |
return html_content | |
# Gradio App | |
with gr.Blocks() as app: | |
gr.Markdown("# Task Configuration Sharing Space") | |
with gr.Tabs() as tabs: | |
with gr.Tab("Submit Task"): | |
gr.Markdown("## Submit a New Task Configuration") | |
# Input fields for the task submission | |
task_type_input = gr.Dropdown( | |
label="Task Type", | |
choices=TASK_TYPES, | |
value="Classification", | |
interactive=True | |
) | |
new_task_input = gr.Textbox( | |
label="Add New Task Type", | |
placeholder="Enter a new task type", | |
interactive=True | |
) | |
add_task_button = gr.Button("Add Task Type") | |
add_task_status = gr.Textbox(label="Status", interactive=False) | |
description_input = gr.Textbox( | |
label="Task Description", | |
placeholder="Provide a brief description of the task.", | |
lines=3 | |
) | |
yaml_input = gr.Textbox( | |
label="YAML/Text Input", | |
placeholder="Paste your YAML or text configuration here.", | |
lines=20 | |
) | |
submit_button = gr.Button("Submit Task") | |
go_to_view_tab = gr.Button("Go to View Tasks") | |
submission_status = gr.Textbox(label="Status", interactive=False) | |
# Handle adding new task type | |
add_task_button.click( | |
add_new_task_type, | |
inputs=[new_task_input], | |
outputs=[task_type_input, add_task_status] | |
) | |
# Handle task submission | |
submit_button.click( | |
submit_task, | |
inputs=[task_type_input, description_input, yaml_input], | |
outputs=[submission_status] | |
) | |
# Button to switch to "View Tasks" tab | |
go_to_view_tab.click( | |
lambda: gr.Tabs.update(visible_tab="View Tasks"), | |
inputs=None, | |
outputs=[tabs] | |
) | |
with gr.Tab("View Tasks"): | |
gr.Markdown("## View Submitted Tasks") | |
task_type_filter = gr.Dropdown( | |
label="Filter by Task Type", | |
choices=TASK_TYPES, | |
value="Classification", | |
interactive=True | |
) | |
view_button = gr.Button("View Tasks") | |
task_display = gr.HTML(label="Submitted Tasks") | |
go_to_submit_tab = gr.Button("Go to Submit Task") | |
# Handle task display | |
view_button.click( | |
display_tasks, | |
inputs=[task_type_filter], | |
outputs=[task_display] | |
) | |
# Button to switch to "Submit Task" tab | |
go_to_submit_tab.click( | |
lambda: gr.Tabs.update(visible_tab="Submit Task"), | |
inputs=None, | |
outputs=[tabs] | |
) | |
app.launch() |