Spaces:
Running
Running
import os | |
import streamlit as st | |
from dotenv import load_dotenv | |
load_dotenv() | |
# Constants | |
DATA_FOLDER = "data" | |
PREVIEW_FOLDER = "Preview" | |
def get_text_files_content(folder): | |
""" | |
Reads all .txt files from a given folder and | |
returns their combined text content. | |
""" | |
text = "" | |
if not os.path.exists(folder): | |
return text | |
for filename in os.listdir(folder): | |
if filename.endswith(".txt"): | |
file_path = os.path.join(folder, filename) | |
with open(file_path, "r", encoding="utf-8") as file: | |
text += file.read() + "\n" | |
return text | |
def notes_page(): | |
st.header("CSS Edge - Notes Viewer :books:") | |
subjects = [ | |
"A Trumped World", "Agri Tax in Punjab", "Assad's Fall in Syria", | |
"Elusive National Unity", "Europe and Trump 2.0", "Going Down with Democracy", | |
"Indonesia's Pancasila Philosophy", "Pakistan in Choppy Waters", | |
"Pakistan's Semiconductor Ambitions", "Preserving Pakistan's Cultural Heritage", | |
"Tackling Informal Economy", "Technical Education in Pakistan", | |
"The Case for Solidarity Levies", "The Decline of the Sole Superpower", | |
"The Power of Big Oil", "Trump 2.0 and Pakistan's Emerging Foreign Policy", | |
"Trump and the World 2.0", "Trump vs BRICS", "US-China Trade War", | |
"War on Humanity", "Women's Suppression in Afghanistan" | |
] | |
# Create dict mapping from subject name -> folder path | |
subject_folders = { | |
subject: os.path.join(DATA_FOLDER, subject.replace(" ", "_")) | |
for subject in subjects | |
} | |
preview_folders = { | |
subject: os.path.join(PREVIEW_FOLDER, subject.replace(" ", "_")) | |
for subject in subjects | |
} | |
# Initialize session state variables | |
if "completed_subjects" not in st.session_state: | |
st.session_state.completed_subjects = [] | |
if "current_subject_index" not in st.session_state: | |
st.session_state.current_subject_index = 0 | |
if "grading_enabled" not in st.session_state: | |
st.session_state.grading_enabled = False | |
# --- CALCULATE AND DISPLAY PROGRESS --- | |
total_subjects = len(subjects) | |
completed_count = len(st.session_state.completed_subjects) | |
progress_fraction = completed_count / total_subjects # e.g. 0.5 means 50% | |
progress_percentage = progress_fraction * 100 | |
# Show progress in the sidebar | |
st.sidebar.title("Your Progress") | |
st.sidebar.progress(progress_fraction) | |
st.sidebar.write(f"You have completed {completed_count} out of {total_subjects} notes.") | |
st.sidebar.write(f"Overall progress: {progress_percentage:.2f}%") | |
# Separate completed and unread subjects | |
unread_subjects = [sub for sub in subjects if sub not in st.session_state.completed_subjects] | |
completed_subjects = st.session_state.completed_subjects | |
# Dropdown to filter notes | |
filter_option = st.sidebar.selectbox("Filter Notes:", ["All", "Unread", "Read"]) | |
if filter_option == "Unread": | |
displayed_subjects = unread_subjects | |
elif filter_option == "Read": | |
displayed_subjects = completed_subjects | |
else: | |
displayed_subjects = subjects | |
# If unread are filtered, allow direct jump | |
if filter_option == "Unread" and unread_subjects: | |
selected_unread_subject = st.sidebar.selectbox("Go to Unread Note:", unread_subjects) | |
st.session_state.current_subject_index = subjects.index(selected_unread_subject) | |
# Sidebar list of displayed subjects (with read/unread status) | |
st.sidebar.subheader("All Subjects") | |
for i, subject in enumerate(displayed_subjects): | |
status = "β" if subject in st.session_state.completed_subjects else "" | |
st.sidebar.text(f"{i + 1}. {subject} {status}") | |
# Show current subject in the sidebar | |
selected_subject = subjects[st.session_state.current_subject_index] | |
st.sidebar.subheader("Current Subject:") | |
st.sidebar.text(selected_subject) | |
# --- PREVIEW SECTION --- | |
preview_folder_path = preview_folders[selected_subject] | |
if os.path.exists(preview_folder_path): | |
preview_text = get_text_files_content(preview_folder_path) | |
st.subheader("Preview of Notes") | |
st.text_area("Preview Content:", preview_text, height=300, disabled=True) | |
else: | |
st.error(f"No preview available for {selected_subject}.") | |
# --- FULL NOTES SECTION --- | |
subject_folder_path = subject_folders[selected_subject] | |
if os.path.exists(subject_folder_path): | |
raw_text = get_text_files_content(subject_folder_path) | |
if raw_text: | |
st.subheader("Notes") | |
st.text_area("Notes Content:", raw_text, height=500, disabled=True) | |
# Button to mark as completed | |
if selected_subject not in st.session_state.completed_subjects: | |
if st.button(f"Mark '{selected_subject}' as Read"): | |
st.session_state.completed_subjects.append(selected_subject) | |
st.success(f"Marked '{selected_subject}' as read!") | |
# Re-run to immediately update progress | |
st.experimental_rerun() | |
# Check if all notes have been read | |
if len(st.session_state.completed_subjects) == len(subjects): | |
st.session_state.grading_enabled = True | |
st.sidebar.success("All subjects completed. You can now proceed to the Grading Tool.") | |
st.markdown("[Proceed to Grading Tool](https://thecssedge.com/wp-admin/admin.php?page=feedback-dashboard)") | |
# Button to go to next subject | |
if st.session_state.current_subject_index < len(subjects) - 1: | |
if st.button("Go to Next Note"): | |
st.session_state.current_subject_index += 1 | |
st.experimental_rerun() | |
else: | |
st.error(f"No text data found for {selected_subject}.") | |
else: | |
st.error(f"No data available for {selected_subject}.") | |
def main(): | |
st.sidebar.title("Navigation") | |
page = st.sidebar.radio("Select a Page:", ["Notes"]) | |
if page == "Notes": | |
notes_page() | |
if __name__ == "__main__": | |
main() | |