Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import pandas as pd | |
| import datetime | |
| from PIL import Image | |
| # Title and Description | |
| st.markdown(""" | |
| <div style="text-align: center; font-family: Arial; padding: 10px; background-color: #4CAF50; color: white;"> | |
| <h1>Smart Project Tracker</h1> | |
| <p>Keep your construction projects on track with real-time updates and insights.</p> | |
| </div> | |
| """, unsafe_allow_html=True) | |
| # Sidebar for Navigation | |
| st.sidebar.markdown(""" | |
| <div style="font-family: Arial; font-size: 16px;"> | |
| <h2>Navigation</h2> | |
| </div> | |
| """, unsafe_allow_html=True) | |
| page = st.sidebar.radio("Go to", ["Track Progress", "Monitor Milestones", "Generate Reports"]) | |
| # Data Containers | |
| if "progress_data" not in st.session_state: | |
| st.session_state.progress_data = [] | |
| if "milestones_data" not in st.session_state: | |
| st.session_state.milestones_data = [] | |
| if "budget_data" not in st.session_state: | |
| st.session_state.budget_data = [] | |
| # Track Progress | |
| if page == "Track Progress": | |
| st.markdown(""" | |
| <div style="background-color: #f0f0f0; padding: 15px; border-radius: 5px;"> | |
| <h2>Track Construction Progress</h2> | |
| </div> | |
| """, unsafe_allow_html=True) | |
| # Upload Section | |
| uploaded_file = st.file_uploader("Upload a photo or video of the site", type=["jpg", "jpeg", "png", "mp4", "mov"]) | |
| if uploaded_file: | |
| file_type = "Video" if uploaded_file.type.startswith("video") else "Image" | |
| date = datetime.date.today() | |
| st.session_state.progress_data.append({"Date": date, "Type": file_type, "File": uploaded_file}) | |
| st.success("File uploaded successfully!") | |
| # Display Progress Updates | |
| st.markdown(""" | |
| <div style="background-color: #e8f5e9; padding: 10px; border-radius: 5px;"> | |
| <h3>Progress Updates</h3> | |
| </div> | |
| """, unsafe_allow_html=True) | |
| for entry in st.session_state.progress_data: | |
| st.write(f"**Date:** {entry['Date']} | **Type:** {entry['Type']}") | |
| if entry['Type'] == "Image": | |
| image = Image.open(entry['File']) | |
| st.image(image, caption="Site Progress") | |
| else: | |
| st.video(entry['File']) | |
| # Monitor Milestones | |
| elif page == "Monitor Milestones": | |
| st.markdown(""" | |
| <div style="background-color: #f0f0f0; padding: 15px; border-radius: 5px;"> | |
| <h2>Monitor Milestones, Budgets, and Deadlines</h2> | |
| </div> | |
| """, unsafe_allow_html=True) | |
| # Add Milestones | |
| st.markdown(""" | |
| <div style="background-color: #e3f2fd; padding: 10px; border-radius: 5px;"> | |
| <h3>Add a Milestone</h3> | |
| </div> | |
| """, unsafe_allow_html=True) | |
| milestone_name = st.text_input("Milestone Name") | |
| milestone_date = st.date_input("Deadline") | |
| milestone_budget = st.number_input("Budget (in PKR)", min_value=0.0, step=100.0) | |
| if st.button("Add Milestone"): | |
| if milestone_name and milestone_date: | |
| st.session_state.milestones_data.append({ | |
| "Name": milestone_name, | |
| "Deadline": milestone_date, | |
| "Budget": milestone_budget | |
| }) | |
| st.success("Milestone added successfully!") | |
| else: | |
| st.error("Please provide all milestone details.") | |
| # Display Milestones | |
| st.markdown(""" | |
| <div style="background-color: #fffde7; padding: 10px; border-radius: 5px;"> | |
| <h3>Upcoming Milestones</h3> | |
| </div> | |
| """, unsafe_allow_html=True) | |
| milestones_df = pd.DataFrame(st.session_state.milestones_data) | |
| if not milestones_df.empty: | |
| st.table(milestones_df) | |
| else: | |
| st.write("No milestones added yet.") | |
| # Generate Reports | |
| elif page == "Generate Reports": | |
| st.markdown(""" | |
| <div style="background-color: #f0f0f0; padding: 15px; border-radius: 5px;"> | |
| <h2>Generate Automated Reports</h2> | |
| </div> | |
| """, unsafe_allow_html=True) | |
| # Generate Summary Report | |
| if st.button("Generate Report"): | |
| st.markdown(""" | |
| <div style="background-color: #e8f5e9; padding: 10px; border-radius: 5px;"> | |
| <h3>Project Summary Report</h3> | |
| </div> | |
| """, unsafe_allow_html=True) | |
| # Milestone Summary | |
| st.markdown("### Milestones") | |
| milestones_df = pd.DataFrame(st.session_state.milestones_data) | |
| if not milestones_df.empty: | |
| st.table(milestones_df) | |
| else: | |
| st.write("No milestones available.") | |
| # Budget Summary | |
| total_budget = milestones_df["Budget"].sum() if not milestones_df.empty else 0 | |
| st.markdown(f"### Total Budget: PKR {total_budget}") | |
| # Progress Summary | |
| st.markdown("### Progress Updates") | |
| for entry in st.session_state.progress_data: | |
| st.write(f"**Date:** {entry['Date']} | **Type:** {entry['Type']}") | |
| if entry['Type'] == "Image": | |
| image = Image.open(entry['File']) | |
| st.image(image, caption="Site Progress") | |
| else: | |
| st.video(entry['File']) | |
| st.sidebar.info("Developed for effective project management.") | |