Replicate the app from the image.
Drop files here
or click to upload
import streamlit as st
import pandas as pd
from datetime import datetime
import uuid
# Set up page config
st.set_page_config(page_title="Task Manager", layout="wide")
# Initialize session state variables if they don't exist
if "tasks" not in st.session_state:
st.session_state.tasks = []
if "filtered_tasks" not in st.session_state:
st.session_state.filtered_tasks = []
if "filter_status" not in st.session_state:
st.session_state.filter_status = "All"
# Function to add a new task
def add_task(title, description, due_date, priority, status="To Do"):
task = {
"id": str(uuid.uuid4()),
"title": title,
"description": description,
"due_date": due_date,
"priority": priority,
"status": status,
"created_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
st.session_state.tasks.append(task)
apply_filters() # Update filtered tasks
# Function to delete a task
def delete_task(task_id):
st.session_state.tasks = [task for task in st.session_state.tasks if task["id"] != task_id]
apply_filters() # Update filtered tasks
# Function to update task status
def update_status(task_id, new_status):
for task in st.session_state.tasks:
if task["id"] == task_id:
task["status"] = new_status
apply_filters() # Update filtered tasks
# Function to apply filters
def apply_filters():
filter_status = st.session_state.filter_status
if filter_status == "All":
st.session_state.filtered_tasks = st.session_state.tasks
else:
st.session_state.filtered_tasks = [task for task in st.session_state.tasks
if task["status"] == filter_status]
# App title
st.title("Task Manager")
# Sidebar with filters
with st.sidebar:
st.header("Filters")
status_filter = st.selectbox(
"Filter by Status",
["All", "To Do", "In Progress", "Done"],
key="status_filter",
on_change=lambda: setattr(st.session_state, 'filter_status', st.session_state.status_filter)
)
# Apply filters button
if st.button("Apply Filters"):
apply_filters()
# Add sample tasks button
if st.button("Add Sample Tasks"):
sample_tasks = [
{
"id": str(uuid.uuid4()),
"title": "Complete Project Proposal",
"description": "Draft the initial proposal for the client project",
"due_date": "2023-12-15",
"priority": "High",
"status": "To Do",
"created_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
},
{
"id": str(uuid.uuid4()),
"title": "Weekly Team Meeting",
"description": "Prepare agenda for weekly sync",
"due_date": "2023-12-10",
"priority": "Medium",
"status": "In Progress",
"created_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
},
{
"id": str(uuid.uuid4()),
"title": "Review Code Changes",
"description": "Review and approve pull requests",
"due_date": "2023-12-08",
"priority": "Low",
"status": "Done",
"created_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
]
st.session_state.tasks.extend(sample_tasks)
apply_filters()
# Add new task form
st.header("Add New Task")
with st.form(key="task_form", clear_on_submit=True):
col1, col2 = st.columns(2)
with col1:
title = st.text_input("Task Title", max_chars=50)
priority = st.selectbox("Priority", ["Low", "Medium", "High"])
with col2:
due_date = st.date_input("Due Date")
status = st.selectbox("Status", ["To Do", "In Progress", "Done"])
description = st.text_area("Description", max_chars=200)
submitted = st.form_submit_button("Add Task")
if submitted and title:
add_task(
title=title,
description=description,
due_date=due_date.strftime("%Y-%m-%d"),
priority=priority,
status=status
)
st.success(f"Task '{title}' added successfully!")
# Apply initial filter if not done already
if not st.session_state.filtered_tasks and st.session_state.tasks:
apply_filters()
# Display tasks
st.header("Tasks")
# Initialize column configuration
priority_colors = {
"High": "🔴",
"Medium": "🟡",
"Low": "🟢"
}
# Create tabs for different views
tab1, tab2 = st.tabs(["Card View", "Table View"])
with tab1:
if not st.session_state.filtered_tasks:
st.info("No tasks found. Add a new task or change filters.")
else:
# Create rows with 3 cards each
for i in range(0, len(st.session_state.filtered_tasks), 3):
cols = st.columns(3)
for j in range(3):
if i + j < len(st.session_state.filtered_tasks):
task = st.session_state.filtered_tasks[i + j]
with cols[j]:
with st.container(border=True):
st.subheader(task["title"])
st.caption(f"Due: {task['due_date']} | {priority_colors[task['priority']]} {task['priority']}")
st.write(task["description"])
status_col, action_col = st.columns([3, 1])
with status_col:
new_status = st.selectbox(
"Status",
["To Do", "In Progress", "Done"],
index=["To Do", "In Progress", "Done"].index(task["status"]),
key=f"status_{task['id']}",
on_change=update_status,
args=(task["id"], st.session_state[f"status_{task['id']}"]),
)
with action_col:
if st.button("Delete", key=f"delete_{task['id']}"):
delete_task(task["id"])
st.rerun()
with tab2:
if not st.session_state.filtered_tasks:
st.info("No tasks found. Add a new task or change filters.")
else:
# Convert tasks to DataFrame for table view
df = pd.DataFrame(st.session_state.filtered_tasks)
df = df[["title", "description", "due_date", "priority", "status"]]
# Rename columns for better display
df.columns = ["Title", "Description", "Due Date", "Priority", "Status"]
st.dataframe(df, use_container_width=True)
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?