import gradio as gr import json import os from datetime import datetime # File to store tasks TASKS_FILE = "tasks.json" def load_tasks(): if os.path.exists(TASKS_FILE): with open(TASKS_FILE, "r") as f: return json.load(f) return [] def save_tasks(tasks): with open(TASKS_FILE, "w") as f: json.dump(tasks, f) def add_task(task_name, task_description, task_priority, task_due_date): tasks = load_tasks() new_task = { "id": len(tasks) + 1, "name": task_name, "description": task_description, "priority": task_priority, "due_date": task_due_date, "completed": False, "created_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S") } tasks.append(new_task) save_tasks(tasks) return "", "", "normal", None, update_task_list() def update_task_list(filter_status="all", filter_priority="all"): tasks = load_tasks() if filter_status != "all": completed = filter_status == "completed" tasks = [task for task in tasks if task["completed"] == completed] if filter_priority != "all": tasks = [task for task in tasks if task["priority"] == filter_priority] if not tasks: return "No tasks found." html_content = "
" for task in tasks: status_class = "line-through text-gray-500" if task["completed"] else "" priority_color = { "low": "bg-green-100 text-green-800", "normal": "bg-blue-100 text-blue-800", "high": "bg-red-100 text-red-800" }.get(task["priority"], "bg-gray-100 text-gray-800") due_date = task["due_date"] if task["due_date"] else "No due date" html_content += f"""

{task['name']}

{task['description']}

{task['priority'].capitalize()} {due_date} Created: {task['created_at']}
""" html_content += "
" return html_content def toggle_task_completion(task_id): tasks = load_tasks() for task in tasks: if task["id"] == task_id: task["completed"] = not task["completed"] break save_tasks(tasks) return update_task_list() def delete_task(task_id): tasks = load_tasks() tasks = [task for task in tasks if task["id"] != task_id] # Reassign IDs for i, task in enumerate(tasks): task["id"] = i + 1 save_tasks(tasks) return update_task_list() def clear_completed_tasks(): tasks = load_tasks() tasks = [task for task in tasks if not task["completed"]] # Reassign IDs for i, task in enumerate(tasks): task["id"] = i + 1 save_tasks(tasks) return update_task_list() with gr.Blocks(title="To-Do App", theme=gr.themes.Soft()) as demo: gr.HTML("""

📝 To-Do App

Built with anycoder
""") with gr.Row(): with gr.Column(scale=1): task_name = gr.Textbox(label="Task Name", placeholder="Enter task name...") task_description = gr.Textbox(label="Description", placeholder="Enter task description...", lines=3) task_priority = gr.Radio(["low", "normal", "high"], label="Priority", value="normal") task_due_date = gr.DateTime(label="Due Date (Optional)", include_time=True) add_btn = gr.Button("Add Task", variant="primary") with gr.Column(scale=2): with gr.Row(): filter_status = gr.Radio(["all", "active", "completed"], label="Filter by Status", value="all") filter_priority = gr.Radio(["all", "low", "normal", "high"], label="Filter by Priority", value="all") task_list = gr.HTML(label="Tasks", value=update_task_list()) with gr.Row(): clear_completed_btn = gr.Button("Clear Completed Tasks", variant="stop") # JavaScript for handling button clicks gr.HTML(""" """) # Event handlers add_btn.click( add_task, inputs=[task_name, task_description, task_priority, task_due_date], outputs=[task_name, task_description, task_priority, task_due_date, task_list] ) filter_status.change( update_task_list, inputs=[filter_status, filter_priority], outputs=task_list ) filter_priority.change( update_task_list, inputs=[filter_status, filter_priority], outputs=task_list ) clear_completed_btn.click( clear_completed_tasks, outputs=task_list ) # Add API endpoints for JavaScript calls @demo.app.post("/complete_task") async def api_complete_task(request): form = await request.form() task_id = int(form["task_id"]) result = toggle_task_completion(task_id) return {"html": result} @demo.app.post("/delete_task") async def api_delete_task(request): form = await request.form() task_id = int(form["task_id"]) result = delete_task(task_id) return {"html": result} if __name__ == "__main__": demo.launch()