updated UI code ✅✅
Browse files- mediSync/app.py +24 -28
mediSync/app.py
CHANGED
|
@@ -29,16 +29,6 @@ from utils.visualization import (
|
|
| 29 |
plot_multimodal_results,
|
| 30 |
plot_report_entities,
|
| 31 |
)
|
| 32 |
-
import logging
|
| 33 |
-
import os
|
| 34 |
-
import sys
|
| 35 |
-
import tempfile
|
| 36 |
-
from pathlib import Path
|
| 37 |
-
import requests
|
| 38 |
-
import gradio as gr
|
| 39 |
-
import matplotlib.pyplot as plt
|
| 40 |
-
from PIL import Image
|
| 41 |
-
|
| 42 |
# Set up logging
|
| 43 |
logging.basicConfig(
|
| 44 |
level=logging.INFO,
|
|
@@ -49,6 +39,15 @@ logger = logging.getLogger(__name__)
|
|
| 49 |
|
| 50 |
# Create temporary directory for sample data if it doesn't exist
|
| 51 |
os.makedirs(os.path.join(parent_dir, "data", "sample"), exist_ok=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 52 |
|
| 53 |
# Import configuration for end consultation logic
|
| 54 |
try:
|
|
@@ -559,12 +558,9 @@ def create_interface():
|
|
| 559 |
import urllib.parse
|
| 560 |
try:
|
| 561 |
url_params = {}
|
| 562 |
-
if
|
| 563 |
-
|
| 564 |
-
|
| 565 |
-
parsed = urllib.parse.urlparse(current_url)
|
| 566 |
-
url_params = urllib.parse.parse_qs(parsed.query)
|
| 567 |
-
default_appointment_id = url_params.get('appointment_id', [''])[0]
|
| 568 |
except:
|
| 569 |
default_appointment_id = ""
|
| 570 |
appointment_id_input = gr.Textbox(
|
|
@@ -697,7 +693,7 @@ def create_interface():
|
|
| 697 |
)
|
| 698 |
|
| 699 |
def handle_end_consultation(appointment_id):
|
| 700 |
-
# Output status:
|
| 701 |
if not appointment_id or appointment_id.strip() == "":
|
| 702 |
return "<div style='color: #000; background: #fff; padding: 10px; border-radius: 5px;'>Please enter your appointment ID first.</div>"
|
| 703 |
result = complete_appointment(appointment_id.strip())
|
|
@@ -705,15 +701,15 @@ def create_interface():
|
|
| 705 |
doctors_urls = get_doctors_page_urls()
|
| 706 |
html_response = f"""
|
| 707 |
<div style='color: #000; background: #fff; padding: 15px; border-radius: 5px; margin: 10px 0;'>
|
| 708 |
-
<h3 style="color: #
|
| 709 |
-
<p>✔️ {result['message']}</p>
|
| 710 |
<p>Your appointment has been marked as completed.</p>
|
| 711 |
<button onclick="window.open('{doctors_urls['local']}', '_blank')"
|
| 712 |
-
style="background-color: #00bfae; color: white; padding:
|
| 713 |
Return to Doctors Page (Local)
|
| 714 |
</button>
|
| 715 |
<button onclick="window.open('{doctors_urls['production']}', '_blank')"
|
| 716 |
-
style="background-color: #6c63ff; color: white; padding:
|
| 717 |
Return to Doctors Page (Production)
|
| 718 |
</button>
|
| 719 |
</div>
|
|
@@ -722,7 +718,7 @@ def create_interface():
|
|
| 722 |
if "Cannot connect to Flask app" in result['message']:
|
| 723 |
html_response = f"""
|
| 724 |
<div style='color: #000; background: #fff; padding: 15px; border-radius: 5px; margin: 10px 0;'>
|
| 725 |
-
<h3 style="color: #
|
| 726 |
<p>Your consultation analysis is complete! However, we cannot automatically mark your appointment as completed because the Flask app is not accessible from this environment.</p>
|
| 727 |
<p><strong>Appointment ID:</strong> {appointment_id.strip()}</p>
|
| 728 |
<p><strong>Next Steps:</strong></p>
|
|
@@ -733,15 +729,15 @@ def create_interface():
|
|
| 733 |
</ol>
|
| 734 |
<div style="margin-top: 15px;">
|
| 735 |
<button onclick="window.open('http://127.0.0.1:600/complete_appointment_manual?appointment_id={appointment_id.strip()}', '_blank')"
|
| 736 |
-
style="background-color: #00bfae; color: white; padding:
|
| 737 |
Complete Appointment
|
| 738 |
</button>
|
| 739 |
<button onclick="window.open('http://127.0.0.1:600/doctors', '_blank')"
|
| 740 |
-
style="background-color: #6c63ff; color: white; padding:
|
| 741 |
Return to Doctors Page
|
| 742 |
</button>
|
| 743 |
<button onclick="navigator.clipboard.writeText('{appointment_id.strip()}')"
|
| 744 |
-
style="background-color: #23272f; color: white; padding:
|
| 745 |
Copy Appointment ID
|
| 746 |
</button>
|
| 747 |
</div>
|
|
@@ -750,7 +746,7 @@ def create_interface():
|
|
| 750 |
else:
|
| 751 |
html_response = f"""
|
| 752 |
<div style='color: #000; background: #fff; padding: 15px; border-radius: 5px; margin: 10px 0;'>
|
| 753 |
-
<h3 style="color: #
|
| 754 |
<p>{result['message']}</p>
|
| 755 |
<p>Please try again or contact support if the problem persists.</p>
|
| 756 |
</div>
|
|
@@ -763,13 +759,13 @@ def create_interface():
|
|
| 763 |
outputs=[end_consultation_status]
|
| 764 |
)
|
| 765 |
|
| 766 |
-
# JavaScript for appointment ID auto-population
|
| 767 |
gr.HTML("""
|
| 768 |
<script>
|
| 769 |
function getUrlParameter(name) {
|
| 770 |
name = name.replace(/[[]/, '\\[').replace(/[\]]/, '\\]');
|
| 771 |
var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
|
| 772 |
-
var results = regex.exec(location.search);
|
| 773 |
return results === null ? '' : decodeURIComponent(results[1].replace(/\\+/g, ' '));
|
| 774 |
}
|
| 775 |
function populateAppointmentId() {
|
|
|
|
| 29 |
plot_multimodal_results,
|
| 30 |
plot_report_entities,
|
| 31 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
# Set up logging
|
| 33 |
logging.basicConfig(
|
| 34 |
level=logging.INFO,
|
|
|
|
| 39 |
|
| 40 |
# Create temporary directory for sample data if it doesn't exist
|
| 41 |
os.makedirs(os.path.join(parent_dir, "data", "sample"), exist_ok=True)
|
| 42 |
+
import logging
|
| 43 |
+
import os
|
| 44 |
+
import sys
|
| 45 |
+
import tempfile
|
| 46 |
+
from pathlib import Path
|
| 47 |
+
import requests
|
| 48 |
+
import gradio as gr
|
| 49 |
+
import matplotlib.pyplot as plt
|
| 50 |
+
from PIL import Image
|
| 51 |
|
| 52 |
# Import configuration for end consultation logic
|
| 53 |
try:
|
|
|
|
| 558 |
import urllib.parse
|
| 559 |
try:
|
| 560 |
url_params = {}
|
| 561 |
+
# Use window.location.search if available, fallback to gradio's get_current_url
|
| 562 |
+
# This logic is for server-side, so we will use a placeholder and rely on JS for actual population
|
| 563 |
+
default_appointment_id = ""
|
|
|
|
|
|
|
|
|
|
| 564 |
except:
|
| 565 |
default_appointment_id = ""
|
| 566 |
appointment_id_input = gr.Textbox(
|
|
|
|
| 693 |
)
|
| 694 |
|
| 695 |
def handle_end_consultation(appointment_id):
|
| 696 |
+
# Output status: styled with color for buttons and clear status box, as per template
|
| 697 |
if not appointment_id or appointment_id.strip() == "":
|
| 698 |
return "<div style='color: #000; background: #fff; padding: 10px; border-radius: 5px;'>Please enter your appointment ID first.</div>"
|
| 699 |
result = complete_appointment(appointment_id.strip())
|
|
|
|
| 701 |
doctors_urls = get_doctors_page_urls()
|
| 702 |
html_response = f"""
|
| 703 |
<div style='color: #000; background: #fff; padding: 15px; border-radius: 5px; margin: 10px 0;'>
|
| 704 |
+
<h3 style="color: #28a745;">✅ Consultation Completed Successfully!</h3>
|
| 705 |
+
<p style="color: #28a745;">✔️ {result['message']}</p>
|
| 706 |
<p>Your appointment has been marked as completed.</p>
|
| 707 |
<button onclick="window.open('{doctors_urls['local']}', '_blank')"
|
| 708 |
+
style="background-color: #00bfae; color: white; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; margin-top: 10px;">
|
| 709 |
Return to Doctors Page (Local)
|
| 710 |
</button>
|
| 711 |
<button onclick="window.open('{doctors_urls['production']}', '_blank')"
|
| 712 |
+
style="background-color: #6c63ff; color: white; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; margin-top: 10px; margin-left: 10px;">
|
| 713 |
Return to Doctors Page (Production)
|
| 714 |
</button>
|
| 715 |
</div>
|
|
|
|
| 718 |
if "Cannot connect to Flask app" in result['message']:
|
| 719 |
html_response = f"""
|
| 720 |
<div style='color: #000; background: #fff; padding: 15px; border-radius: 5px; margin: 10px 0;'>
|
| 721 |
+
<h3 style="color: #ff9800;">⚠️ Consultation Ready to Complete</h3>
|
| 722 |
<p>Your consultation analysis is complete! However, we cannot automatically mark your appointment as completed because the Flask app is not accessible from this environment.</p>
|
| 723 |
<p><strong>Appointment ID:</strong> {appointment_id.strip()}</p>
|
| 724 |
<p><strong>Next Steps:</strong></p>
|
|
|
|
| 729 |
</ol>
|
| 730 |
<div style="margin-top: 15px;">
|
| 731 |
<button onclick="window.open('http://127.0.0.1:600/complete_appointment_manual?appointment_id={appointment_id.strip()}', '_blank')"
|
| 732 |
+
style="background-color: #00bfae; color: white; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; margin-right: 10px;">
|
| 733 |
Complete Appointment
|
| 734 |
</button>
|
| 735 |
<button onclick="window.open('http://127.0.0.1:600/doctors', '_blank')"
|
| 736 |
+
style="background-color: #6c63ff; color: white; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; margin-right: 10px;">
|
| 737 |
Return to Doctors Page
|
| 738 |
</button>
|
| 739 |
<button onclick="navigator.clipboard.writeText('{appointment_id.strip()}')"
|
| 740 |
+
style="background-color: #23272f; color: white; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer;">
|
| 741 |
Copy Appointment ID
|
| 742 |
</button>
|
| 743 |
</div>
|
|
|
|
| 746 |
else:
|
| 747 |
html_response = f"""
|
| 748 |
<div style='color: #000; background: #fff; padding: 15px; border-radius: 5px; margin: 10px 0;'>
|
| 749 |
+
<h3 style="color: #dc3545;">❌ Error Completing Consultation</h3>
|
| 750 |
<p>{result['message']}</p>
|
| 751 |
<p>Please try again or contact support if the problem persists.</p>
|
| 752 |
</div>
|
|
|
|
| 759 |
outputs=[end_consultation_status]
|
| 760 |
)
|
| 761 |
|
| 762 |
+
# JavaScript for appointment ID auto-population (reference template logic)
|
| 763 |
gr.HTML("""
|
| 764 |
<script>
|
| 765 |
function getUrlParameter(name) {
|
| 766 |
name = name.replace(/[[]/, '\\[').replace(/[\]]/, '\\]');
|
| 767 |
var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
|
| 768 |
+
var results = regex.exec(window.location.search);
|
| 769 |
return results === null ? '' : decodeURIComponent(results[1].replace(/\\+/g, ' '));
|
| 770 |
}
|
| 771 |
function populateAppointmentId() {
|