|
|
import streamlit as st |
|
|
from datetime import datetime, timedelta, time |
|
|
import calendar |
|
|
import pandas as pd |
|
|
|
|
|
def render_calendar(month, year): |
|
|
st.write(f"### {calendar.month_name[month]} {year}") |
|
|
weekdays = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] |
|
|
month_days = calendar.monthcalendar(year, month) |
|
|
table = [] |
|
|
for week in month_days: |
|
|
row = [] |
|
|
for day in week: |
|
|
row.append(day if day != 0 else "") |
|
|
table.append(row) |
|
|
|
|
|
df = pd.DataFrame(table, columns=weekdays) |
|
|
return df |
|
|
|
|
|
|
|
|
def log_task_for_date(selected_date): |
|
|
if selected_date not in st.session_state: |
|
|
st.session_state[selected_date] = [] |
|
|
|
|
|
st.write(f"### Tasks for {selected_date}") |
|
|
|
|
|
task = st.text_input("Enter a task", key=f"task_input_{selected_date}") |
|
|
category = st.selectbox("Select Category", ["Work", "Personal", "Urgent", "Other"], key=f"category_select_{selected_date}") |
|
|
priority = st.selectbox("Select Priority", ["High", "Medium", "Low"], key=f"priority_select_{selected_date}") |
|
|
due_date = st.date_input("Select Due Date", min_value=datetime.today(), key=f"due_date_input_{selected_date}") |
|
|
|
|
|
|
|
|
time_options = [time(hour=h, minute=m).strftime("%H:%M") for h in range(24) for m in (0, 30)] |
|
|
selected_time_str = st.selectbox( |
|
|
"Select Due Time", |
|
|
options=time_options, |
|
|
index=time_options.index("09:00"), |
|
|
key=f"due_time_input_{selected_date}" |
|
|
) |
|
|
due_time = datetime.strptime(selected_time_str, "%H:%M").time() |
|
|
|
|
|
if st.button("Add Task", key=f"add_task_button_{selected_date}"): |
|
|
task_info = { |
|
|
"task": task, |
|
|
"category": category, |
|
|
"priority": priority, |
|
|
"due_date": str(due_date), |
|
|
"due_time": str(due_time), |
|
|
"completed": False, |
|
|
} |
|
|
if task_info not in st.session_state[selected_date]: |
|
|
st.session_state[selected_date].append(task_info) |
|
|
st.success("Task added!") |
|
|
else: |
|
|
st.warning("Task already exists!") |
|
|
|
|
|
if st.session_state[selected_date]: |
|
|
st.write("**Current Tasks:**") |
|
|
task_df = pd.DataFrame(st.session_state[selected_date]) |
|
|
task_df = task_df.sort_values(by=["priority", "due_date", "due_time"], ascending=[True, True, True]) |
|
|
|
|
|
for idx, row in task_df.iterrows(): |
|
|
task_str = f"{row['task']} - Category: {row['category']} | Priority: {row['priority']} | Due: {row['due_date']} {row['due_time']}" |
|
|
if row['completed']: |
|
|
task_str = f"β
{task_str}" |
|
|
st.write(task_str) |
|
|
mark_as_completed = st.checkbox( |
|
|
f"Mark as completed", |
|
|
key=f"complete_{selected_date}_{idx}", |
|
|
value=row['completed'] |
|
|
) |
|
|
if mark_as_completed and not row['completed']: |
|
|
st.session_state[selected_date][idx]["completed"] = True |
|
|
st.success(f"Task '{row['task']}' marked as completed!") |
|
|
|
|
|
|
|
|
def view_tasks_by_date(): |
|
|
st.write("## π View Tasks by Date") |
|
|
selected = st.date_input("Pick a Date to View Tasks", value=datetime.today()) |
|
|
selected_str = str(selected) |
|
|
tasks = st.session_state.get(selected_str, []) |
|
|
|
|
|
if tasks: |
|
|
st.write(f"### Tasks for {selected_str}") |
|
|
for idx, task in enumerate(tasks): |
|
|
with st.expander(f"{'β
' if task['completed'] else ''}{task['task']}"): |
|
|
st.write(f"**Category:** {task['category']}") |
|
|
st.write(f"**Priority:** {task['priority']}") |
|
|
st.write(f"**Due Date:** {task['due_date']}") |
|
|
st.write(f"**Due Time:** {task['due_time']}") |
|
|
st.write(f"**Completed:** {'Yes β
' if task['completed'] else 'No β'}") |
|
|
else: |
|
|
st.info("No tasks logged for this date.") |
|
|
|
|
|
|
|
|
def highlight_today(month, year): |
|
|
today = datetime.today() |
|
|
if today.month == month and today.year == year: |
|
|
return today.day |
|
|
return None |
|
|
|
|
|
|
|
|
def get_task_csv(scope, selected_date): |
|
|
tasks = [] |
|
|
for date, task_list in st.session_state.items(): |
|
|
if isinstance(task_list, list): |
|
|
if scope == "day" and date == selected_date: |
|
|
tasks.extend(task_list) |
|
|
elif scope == "month" and date.startswith(selected_date[:7]): |
|
|
tasks.extend(task_list) |
|
|
elif scope == "year" and date.startswith(selected_date[:4]): |
|
|
tasks.extend(task_list) |
|
|
df = pd.DataFrame(tasks) |
|
|
return df.to_csv(index=False) |
|
|
|
|
|
|
|
|
def main(): |
|
|
|
|
|
st.markdown( |
|
|
""" |
|
|
<style> |
|
|
/* Main background */ |
|
|
[data-testid="stAppViewContainer"] { |
|
|
background-image: url('https://png.pngtree.com/thumb_back/fh260/background/20240916/pngtree-simple-orange-aesthetic-background-image_16213466.jpg'); |
|
|
background-size: cover; |
|
|
background-position: center; |
|
|
background-repeat: no-repeat; |
|
|
} |
|
|
|
|
|
/* Sidebar background */ |
|
|
[data-testid="stSidebar"] > div:first-child { |
|
|
background-image: url('https://st.depositphotos.com/2890321/51451/i/600/depositphotos_514519944-stock-photo-close-calendar-purple-table-background.jpg'); |
|
|
background-size: cover; |
|
|
background-position: center; |
|
|
} |
|
|
|
|
|
/* Optional: semi-transparent overlay for content readability */ |
|
|
.main > div { |
|
|
background-color: rgba(255, 255, 255, 0.85); |
|
|
padding: 1rem; |
|
|
border-radius: 12px; |
|
|
} |
|
|
|
|
|
/* Styling sidebar links */ |
|
|
.sidebar-links img { |
|
|
width: 20px; |
|
|
margin-right: 10px; |
|
|
vertical-align: middle; |
|
|
} |
|
|
.sidebar-links a { |
|
|
text-decoration: none; |
|
|
display: inline-block; |
|
|
color: white; |
|
|
font-weight: bold; |
|
|
margin-bottom: 8px; |
|
|
} |
|
|
</style> |
|
|
""", |
|
|
unsafe_allow_html=True |
|
|
) |
|
|
|
|
|
st.title("π
Dynamic Calendar & Task Logger") |
|
|
|
|
|
|
|
|
st.sidebar.title("Navigation") |
|
|
app_mode = st.sidebar.radio("Choose an Option", ("Log Tasks", "View Tasks", "Download Task Data")) |
|
|
|
|
|
|
|
|
st.sidebar.markdown("## π¨βπ» Connect with Me") |
|
|
st.sidebar.markdown(""" |
|
|
<div class="sidebar-links"> |
|
|
<a href="https://github.com/marianadeem755" target="_blank"> |
|
|
<img src="https://cdn-icons-png.flaticon.com/512/25/25231.png"> GitHub |
|
|
</a><br> |
|
|
<a href="https://www.kaggle.com/marianadeem755" target="_blank"> |
|
|
<img src="https://cdn4.iconfinder.com/data/icons/logos-and-brands/512/189_Kaggle_logo_logos-512.png"> Kaggle |
|
|
</a><br> |
|
|
<a href="mailto:marianadeem755@gmail.com"> |
|
|
<img src="https://cdn-icons-png.flaticon.com/512/561/561127.png"> Email |
|
|
</a><br> |
|
|
<a href="https://huggingface.co/maria355" target="_blank"> |
|
|
<img src="https://huggingface.co/front/assets/huggingface_logo-noborder.svg"> Hugging Face |
|
|
</a> |
|
|
</div> |
|
|
""", unsafe_allow_html=True) |
|
|
|
|
|
if "initialized" not in st.session_state: |
|
|
st.session_state.initialized = True |
|
|
|
|
|
today = datetime.today() |
|
|
month = st.selectbox("Select Month", list(range(1, 13)), index=today.month - 1) |
|
|
year = st.selectbox("Select Year", list(range(today.year - 5, today.year + 6)), index=5) |
|
|
|
|
|
calendar_df = render_calendar(month, year) |
|
|
today_day = highlight_today(month, year) |
|
|
|
|
|
for col in calendar_df.columns: |
|
|
calendar_df[col] = calendar_df[col].apply(lambda x: f"**{x}**" if x == today_day else x) |
|
|
|
|
|
st.table(calendar_df) |
|
|
|
|
|
selected_date = st.date_input("Select a Date to Add Tasks", today) |
|
|
|
|
|
if app_mode == "Log Tasks": |
|
|
log_task_for_date(str(selected_date)) |
|
|
|
|
|
elif app_mode == "View Tasks": |
|
|
view_tasks_by_date() |
|
|
|
|
|
elif app_mode == "Download Task Data": |
|
|
col1, col2, col3 = st.columns(3) |
|
|
with col1: |
|
|
st.download_button( |
|
|
"Download for Day π
", |
|
|
data=get_task_csv("day", str(selected_date)), |
|
|
file_name=f"tasks_day_{selected_date}.csv", |
|
|
mime="text/csv" |
|
|
) |
|
|
with col2: |
|
|
st.download_button( |
|
|
"Download for Month ποΈ", |
|
|
data=get_task_csv("month", str(selected_date)), |
|
|
file_name=f"tasks_month_{selected_date.strftime('%Y-%m')}.csv", |
|
|
mime="text/csv" |
|
|
) |
|
|
with col3: |
|
|
st.download_button( |
|
|
"Download for Year π", |
|
|
data=get_task_csv("year", str(selected_date)), |
|
|
file_name=f"tasks_year_{selected_date.strftime('%Y')}.csv", |
|
|
mime="text/csv" |
|
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
|
main() |