Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import pandas as pd | |
| import json | |
| import time # For simulating delays | |
| # --- Configuration and Initial Setup --- | |
| st.set_page_config(layout="wide", page_title="Dummy URS Doc Processor UI Test") | |
| st.title("Dummy URS Doc Processor - UI Test Version") | |
| # Initialize session states | |
| if "show_step2" not in st.session_state: | |
| st.session_state.show_step2 = False | |
| if "show_step3" not in st.session_state: | |
| st.session_state.show_step3 = False | |
| if "protocol_generated" not in st.session_state: | |
| st.session_state.protocol_generated = False | |
| if "extracted_data" not in st.session_state: | |
| st.session_state.extracted_data = None | |
| if "dataframe" not in st.session_state: | |
| st.session_state.dataframe = None | |
| if "processing" not in st.session_state: | |
| st.session_state.processing = False | |
| if "generated_pdf" not in st.session_state: | |
| st.session_state.generated_pdf = None | |
| if "generated_pdf_name" not in st.session_state: | |
| st.session_state.generated_pdf_name = None | |
| # Dummy LLM setup (no actual LLM calls) | |
| def get_llms(): | |
| return None, None # No LLMs needed for UI test | |
| # --------------------- Dummy Backend Functions --------------------- | |
| def dummy_run_rag_pipeline(pdf_file, template_file): | |
| """ | |
| Simulates the RAG pipeline for UI testing. | |
| Returns dummy extracted data. | |
| """ | |
| st.toast("Simulating RAG Pipeline...") | |
| time.sleep(2) # Simulate processing time | |
| # Dummy extracted data | |
| dummy_data = { | |
| "ProjectName": "Dummy Project UI", | |
| "DocumentNumber": "DUMMY-001", | |
| "SystemName": "Test System Beta", | |
| "Version": "1.0.0", | |
| "Author": "UI Tester", | |
| "Date": "2025-07-21", | |
| "FunctionalRequirement_1": "The system shall display data responsively on mobile devices.", | |
| "FunctionalRequirement_2": "The system shall allow editing of extracted values.", | |
| "Utility#1": "Power Supply (240V)", | |
| "Utility#2": "Ethernet Connection", | |
| "SoftwareRequirements": "Python 3.9+, Streamlit 1.x", | |
| "HardwareRequirements": "Any modern smartphone or tablet" | |
| } | |
| st.toast("RAG Pipeline simulation complete!") | |
| return dummy_data | |
| def dummy_json_to_dataframe(json_data): | |
| """ | |
| Converts dummy JSON data to DataFrame for editing. | |
| """ | |
| if not json_data: | |
| return pd.DataFrame(columns=['Placeholder', 'Value']) | |
| data_list = [] | |
| for key, value in json_data.items(): | |
| data_list.append((str(key), str(value) if value is not None else "")) | |
| df = pd.DataFrame(data_list, columns=['Placeholder', 'Value']) | |
| return df | |
| def create_dummy_pdf(): | |
| """Generates a dummy PDF byte stream for download.""" | |
| from reportlab.lib.pagesizes import letter | |
| from reportlab.pdfgen import canvas | |
| from io import BytesIO | |
| buffer = BytesIO() | |
| p = canvas.Canvas(buffer, pagesize=letter) | |
| p.drawString(100, 750, "This is a Dummy PDF for UI Testing!") | |
| p.drawString(100, 730, "It contains no real data from your URS or protocol.") | |
| p.drawString(100, 710, "Generated on: " + time.ctime()) | |
| p.showPage() | |
| p.save() | |
| buffer.seek(0) | |
| return buffer.getvalue() | |
| # --- Status & Progress Tracking --- | |
| # This section remains largely the same to simulate your original progress logic | |
| progress = 0 | |
| status_text = "🟦 Waiting for input files" | |
| if st.session_state.processing: | |
| progress = 20 | |
| status_text = "Extracting values from uploaded files (simulated)..." | |
| if st.session_state.show_step2: | |
| progress = 40 | |
| status_text = "Input form is being generated (simulated)..." | |
| if st.session_state.show_step3: | |
| progress = 60 | |
| status_text = "Saving changes to input form (simulated)..." | |
| if st.session_state.protocol_generated: | |
| progress = 100 | |
| status_text = "Final protocol document is being generated (simulated)..." | |
| st.markdown(f"### Status: {status_text}") | |
| st.progress(progress / 100.0) | |
| # --- Layout: Horizontal columns for each step --- | |
| st.write("---") # Horizontal line for separation | |
| col1, col2, col3 = st.columns(3) | |
| # --- STEP 1 --- | |
| with col1: | |
| st.markdown("### 🔹 Step 1") | |
| st.write("📄 **Upload input URS (PDF)**") | |
| urs_pdf = st.file_uploader("Upload PDF", type=["pdf"], key="pdf_upload_step1") | |
| st.write("📊 **Upload template (XLSX)**") | |
| template_xlsx = st.file_uploader("Upload XLSX", type=["xlsx"], key="xlsx_upload_step1") | |
| if st.button("➡️ Generate Input Form", key="generate_form_button"): | |
| if urs_pdf and template_xlsx: | |
| st.session_state.processing = True | |
| st.rerun() | |
| else: | |
| st.warning("Please upload both PDF and XLSX files for the simulation.") | |
| # Process RAG pipeline if processing is True | |
| if st.session_state.processing: | |
| with st.spinner("🔄 Running RAG Pipeline (Simulated)..."): | |
| # Call the dummy RAG pipeline | |
| result = dummy_run_rag_pipeline(urs_pdf, template_xlsx) | |
| if result: | |
| st.session_state.extracted_data = result | |
| st.session_state.dataframe = dummy_json_to_dataframe(result) | |
| st.session_state.show_step2 = True | |
| st.session_state.processing = False | |
| st.success("✅ RAG Pipeline simulation completed!") | |
| st.rerun() | |
| else: | |
| st.error("❌ Failed to simulate document processing. Try again.") | |
| st.session_state.processing = False | |
| st.rerun() | |
| st.write("---") # Horizontal line for separation | |
| # --- STEP 2 --- | |
| with col2: | |
| if st.session_state.show_step2: | |
| st.markdown("### 🔹 Step 2") | |
| if st.session_state.dataframe is not None: | |
| st.markdown("✏️ **Edit Input Form (DataFrame)**") | |
| # Display editable dataframe | |
| edited_df = st.data_editor( | |
| st.session_state.dataframe, | |
| num_rows="dynamic", | |
| key="data_editor", | |
| height=400 # Fixed height for better mobile consistency | |
| ) | |
| # Update session state with edited data (for dummy purposes) | |
| st.session_state.dataframe = edited_df | |
| if st.button("💾 Save Changes", key="save_changes_button"): | |
| # Simulate saving changes | |
| st.session_state.extracted_data = { | |
| row['Placeholder']: row['Value'] | |
| for _, row in edited_df.iterrows() | |
| if pd.notna(row['Value']) and row['Value'] != '' | |
| } | |
| st.success("✅ Changes saved (simulated)!") | |
| st.session_state.show_step3 = True | |
| st.rerun() | |
| else: | |
| st.markdown("### 🔹 Step 2") | |
| st.info("Complete Step 1 to unlock.") | |
| st.write("---") # Horizontal line for separation | |
| # --- STEP 3 --- | |
| with col3: | |
| if st.session_state.show_step3: | |
| st.markdown("### 🔹 Step 3") | |
| st.write("📤 **Upload Protocol Template (DOCX)**") | |
| output_docx = st.file_uploader("Upload DOCX", type=["docx"], key="docx_upload_step3") | |
| # Dummy progress bar for protocol generation steps | |
| protocol_status_text = st.empty() | |
| protocol_progress_bar_inner = st.progress(0.0) | |
| if st.button("📝 Generate Protocol Document", key="generate_protocol_button"): | |
| if output_docx is None: | |
| st.warning("Please upload a DOCX template file for the simulation.") | |
| else: | |
| protocol_status_text.text("💾 Saving completed DOCX (simulated)...") | |
| protocol_progress_bar_inner.progress(0.5) | |
| time.sleep(1) # Simulate delay | |
| protocol_status_text.text("⏳ Converting DOCX to PDF (simulated)...") | |
| protocol_progress_bar_inner.progress(0.7) | |
| time.sleep(1) # Simulate delay | |
| # Generate a dummy PDF | |
| st.session_state.generated_pdf = create_dummy_pdf() | |
| st.session_state.generated_pdf_name = "dummy_final_protocol.pdf" | |
| st.session_state.protocol_generated = True | |
| protocol_status_text.text("✅ Final protocol document generated (simulated)!") | |
| protocol_progress_bar_inner.progress(1.0) | |
| st.success("✅ Protocol document generated! You can now view or download the dummy PDF.") | |
| st.rerun() | |
| if st.session_state.protocol_generated and hasattr(st.session_state, 'generated_pdf'): | |
| st.markdown("#### 📥 View / Download") | |
| col_a, col_b = st.columns(2) # Removed 'Save' column | |
| with col_a: | |
| # The 'View PDF' button essentially just triggers a download with preview capabilities | |
| st.download_button( | |
| label="👁️ View PDF", | |
| data=st.session_state.generated_pdf, | |
| file_name=st.session_state.generated_pdf_name, | |
| mime="application/pdf", | |
| key="view_pdf_button" | |
| ) | |
| with col_b: | |
| st.download_button( | |
| label="⬇️ Download PDF", | |
| data=st.session_state.generated_pdf, | |
| file_name=st.session_state.generated_pdf_name, | |
| mime="application/pdf", | |
| key="download_pdf_button" | |
| ) | |
| else: | |
| st.markdown("### 🔹 Step 3") | |
| st.info("Complete Step 2 to unlock.") | |
| st.write("---") # Final horizontal line |