updated the UI code ✅✅
Browse files- mediSync/app.py +35 -66
mediSync/app.py
CHANGED
|
@@ -7,47 +7,6 @@ import requests
|
|
| 7 |
import gradio as gr
|
| 8 |
import matplotlib.pyplot as plt
|
| 9 |
from PIL import Image
|
| 10 |
-
import logging
|
| 11 |
-
import os
|
| 12 |
-
import sys
|
| 13 |
-
import tempfile
|
| 14 |
-
from pathlib import Path
|
| 15 |
-
|
| 16 |
-
import gradio as gr
|
| 17 |
-
import matplotlib.pyplot as plt
|
| 18 |
-
from PIL import Image
|
| 19 |
-
|
| 20 |
-
# Add parent directory to path
|
| 21 |
-
parent_dir = os.path.dirname(os.path.abspath(__file__))
|
| 22 |
-
sys.path.append(parent_dir)
|
| 23 |
-
|
| 24 |
-
# Import our modules
|
| 25 |
-
from models.multimodal_fusion import MultimodalFusion
|
| 26 |
-
from utils.preprocessing import enhance_xray_image, normalize_report_text
|
| 27 |
-
from utils.visualization import (
|
| 28 |
-
plot_image_prediction,
|
| 29 |
-
plot_multimodal_results,
|
| 30 |
-
plot_report_entities,
|
| 31 |
-
)
|
| 32 |
-
# Set up logging
|
| 33 |
-
logging.basicConfig(
|
| 34 |
-
level=logging.INFO,
|
| 35 |
-
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
| 36 |
-
handlers=[logging.StreamHandler(), logging.FileHandler("mediSync.log")],
|
| 37 |
-
)
|
| 38 |
-
logger = logging.getLogger(__name__)
|
| 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:
|
|
@@ -527,6 +486,26 @@ def create_interface():
|
|
| 527 |
#end_consultation_status button:active, #end_consultation_status button:focus {
|
| 528 |
outline: 2px solid #00bfae !important;
|
| 529 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 530 |
"""
|
| 531 |
) as interface:
|
| 532 |
gr.Markdown(
|
|
@@ -555,7 +534,6 @@ def create_interface():
|
|
| 555 |
)
|
| 556 |
|
| 557 |
with gr.Row():
|
| 558 |
-
# The value will be set by JS, so leave it empty here
|
| 559 |
appointment_id_input = gr.Textbox(
|
| 560 |
label="Appointment ID",
|
| 561 |
placeholder="Enter your appointment ID here...",
|
|
@@ -697,12 +675,12 @@ def create_interface():
|
|
| 697 |
<h3 style="color: #28a745;">✅ Consultation Completed Successfully!</h3>
|
| 698 |
<p style="color: #28a745;">✔️ {result['message']}</p>
|
| 699 |
<p>Your appointment has been marked as completed.</p>
|
| 700 |
-
<button onclick="window.open('{doctors_urls['local']}', '_blank')"
|
| 701 |
-
style="
|
| 702 |
Return to Doctors Page (Local)
|
| 703 |
</button>
|
| 704 |
-
<button onclick="window.open('{doctors_urls['production']}', '_blank')"
|
| 705 |
-
style="
|
| 706 |
Return to Doctors Page (Production)
|
| 707 |
</button>
|
| 708 |
</div>
|
|
@@ -721,16 +699,13 @@ def create_interface():
|
|
| 721 |
<li>Manually complete the appointment using the appointment ID</li>
|
| 722 |
</ol>
|
| 723 |
<div style="margin-top: 15px;">
|
| 724 |
-
<button onclick="window.open('http://127.0.0.1:600/complete_appointment_manual?appointment_id={appointment_id.strip()}', '_blank')"
|
| 725 |
-
style="background-color: #00bfae; color: white; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; margin-right: 10px;">
|
| 726 |
Complete Appointment
|
| 727 |
</button>
|
| 728 |
-
<button onclick="window.open('http://127.0.0.1:600/doctors', '_blank')"
|
| 729 |
-
style="background-color: #6c63ff; color: white; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; margin-right: 10px;">
|
| 730 |
Return to Doctors Page
|
| 731 |
</button>
|
| 732 |
-
<button onclick="navigator.clipboard.writeText('{appointment_id.strip()}')"
|
| 733 |
-
style="background-color: #23272f; color: white; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer;">
|
| 734 |
Copy Appointment ID
|
| 735 |
</button>
|
| 736 |
</div>
|
|
@@ -752,10 +727,15 @@ def create_interface():
|
|
| 752 |
outputs=[end_consultation_status]
|
| 753 |
)
|
| 754 |
|
| 755 |
-
# JavaScript for appointment ID auto-population (
|
| 756 |
gr.HTML("""
|
| 757 |
<script>
|
| 758 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 759 |
function setAppointmentIdValue(val) {
|
| 760 |
// Try by ID (Gradio 3.x and some 4.x)
|
| 761 |
var input = document.getElementById('appointment_id_input');
|
|
@@ -793,29 +773,18 @@ def create_interface():
|
|
| 793 |
}
|
| 794 |
return false;
|
| 795 |
}
|
| 796 |
-
|
| 797 |
-
function getUrlParameter(name) {
|
| 798 |
-
name = name.replace(/[[]/, '\\[').replace(/[\]]/, '\\]');
|
| 799 |
-
var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
|
| 800 |
-
var results = regex.exec(window.location.search);
|
| 801 |
-
return results === null ? '' : decodeURIComponent(results[1].replace(/\\+/g, ' '));
|
| 802 |
-
}
|
| 803 |
-
|
| 804 |
function tryPopulateAppointmentId() {
|
| 805 |
var appointmentId = getUrlParameter('appointment_id');
|
| 806 |
if (appointmentId) {
|
| 807 |
setAppointmentIdValue(appointmentId);
|
| 808 |
}
|
| 809 |
}
|
| 810 |
-
|
| 811 |
-
// Try on DOMContentLoaded, on load, and after a delay to ensure Gradio is ready
|
| 812 |
document.addEventListener('DOMContentLoaded', function() {
|
| 813 |
setTimeout(tryPopulateAppointmentId, 400);
|
| 814 |
});
|
| 815 |
window.addEventListener('load', function() {
|
| 816 |
setTimeout(tryPopulateAppointmentId, 1000);
|
| 817 |
});
|
| 818 |
-
// Also try again after 2 seconds in case Gradio loads slowly
|
| 819 |
setTimeout(tryPopulateAppointmentId, 2000);
|
| 820 |
</script>
|
| 821 |
""")
|
|
@@ -823,4 +792,4 @@ def create_interface():
|
|
| 823 |
interface.launch()
|
| 824 |
|
| 825 |
if __name__ == "__main__":
|
| 826 |
-
create_interface()
|
|
|
|
| 7 |
import gradio as gr
|
| 8 |
import matplotlib.pyplot as plt
|
| 9 |
from PIL import Image
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 10 |
|
| 11 |
# Import configuration for end consultation logic
|
| 12 |
try:
|
|
|
|
| 486 |
#end_consultation_status button:active, #end_consultation_status button:focus {
|
| 487 |
outline: 2px solid #00bfae !important;
|
| 488 |
}
|
| 489 |
+
#end_consultation_status .btn-green {
|
| 490 |
+
background-color: #00bfae !important;
|
| 491 |
+
color: #fff !important;
|
| 492 |
+
}
|
| 493 |
+
#end_consultation_status .btn-purple {
|
| 494 |
+
background-color: #6c63ff !important;
|
| 495 |
+
color: #fff !important;
|
| 496 |
+
}
|
| 497 |
+
#end_consultation_status .btn-dark {
|
| 498 |
+
background-color: #23272f !important;
|
| 499 |
+
color: #fff !important;
|
| 500 |
+
}
|
| 501 |
+
#end_consultation_status .btn-orange {
|
| 502 |
+
background-color: #ff9800 !important;
|
| 503 |
+
color: #fff !important;
|
| 504 |
+
}
|
| 505 |
+
#end_consultation_status .btn-red {
|
| 506 |
+
background-color: #dc3545 !important;
|
| 507 |
+
color: #fff !important;
|
| 508 |
+
}
|
| 509 |
"""
|
| 510 |
) as interface:
|
| 511 |
gr.Markdown(
|
|
|
|
| 534 |
)
|
| 535 |
|
| 536 |
with gr.Row():
|
|
|
|
| 537 |
appointment_id_input = gr.Textbox(
|
| 538 |
label="Appointment ID",
|
| 539 |
placeholder="Enter your appointment ID here...",
|
|
|
|
| 675 |
<h3 style="color: #28a745;">✅ Consultation Completed Successfully!</h3>
|
| 676 |
<p style="color: #28a745;">✔️ {result['message']}</p>
|
| 677 |
<p>Your appointment has been marked as completed.</p>
|
| 678 |
+
<button class="btn-green" onclick="window.open('{doctors_urls['local']}', '_blank')"
|
| 679 |
+
style="margin-top: 10px;">
|
| 680 |
Return to Doctors Page (Local)
|
| 681 |
</button>
|
| 682 |
+
<button class="btn-purple" onclick="window.open('{doctors_urls['production']}', '_blank')"
|
| 683 |
+
style="margin-top: 10px; margin-left: 10px;">
|
| 684 |
Return to Doctors Page (Production)
|
| 685 |
</button>
|
| 686 |
</div>
|
|
|
|
| 699 |
<li>Manually complete the appointment using the appointment ID</li>
|
| 700 |
</ol>
|
| 701 |
<div style="margin-top: 15px;">
|
| 702 |
+
<button class="btn-green" onclick="window.open('http://127.0.0.1:600/complete_appointment_manual?appointment_id={appointment_id.strip()}', '_blank')" style="margin-right: 10px;">
|
|
|
|
| 703 |
Complete Appointment
|
| 704 |
</button>
|
| 705 |
+
<button class="btn-purple" onclick="window.open('http://127.0.0.1:600/doctors', '_blank')" style="margin-right: 10px;">
|
|
|
|
| 706 |
Return to Doctors Page
|
| 707 |
</button>
|
| 708 |
+
<button class="btn-dark" onclick="navigator.clipboard.writeText('{appointment_id.strip()}')">
|
|
|
|
| 709 |
Copy Appointment ID
|
| 710 |
</button>
|
| 711 |
</div>
|
|
|
|
| 727 |
outputs=[end_consultation_status]
|
| 728 |
)
|
| 729 |
|
| 730 |
+
# JavaScript for appointment ID auto-population (as in working_hugging_face_code.py)
|
| 731 |
gr.HTML("""
|
| 732 |
<script>
|
| 733 |
+
function getUrlParameter(name) {
|
| 734 |
+
name = name.replace(/[[]/, '\\[').replace(/[\]]/, '\\]');
|
| 735 |
+
var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
|
| 736 |
+
var results = regex.exec(window.location.search);
|
| 737 |
+
return results === null ? '' : decodeURIComponent(results[1].replace(/\\+/g, ' '));
|
| 738 |
+
}
|
| 739 |
function setAppointmentIdValue(val) {
|
| 740 |
// Try by ID (Gradio 3.x and some 4.x)
|
| 741 |
var input = document.getElementById('appointment_id_input');
|
|
|
|
| 773 |
}
|
| 774 |
return false;
|
| 775 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 776 |
function tryPopulateAppointmentId() {
|
| 777 |
var appointmentId = getUrlParameter('appointment_id');
|
| 778 |
if (appointmentId) {
|
| 779 |
setAppointmentIdValue(appointmentId);
|
| 780 |
}
|
| 781 |
}
|
|
|
|
|
|
|
| 782 |
document.addEventListener('DOMContentLoaded', function() {
|
| 783 |
setTimeout(tryPopulateAppointmentId, 400);
|
| 784 |
});
|
| 785 |
window.addEventListener('load', function() {
|
| 786 |
setTimeout(tryPopulateAppointmentId, 1000);
|
| 787 |
});
|
|
|
|
| 788 |
setTimeout(tryPopulateAppointmentId, 2000);
|
| 789 |
</script>
|
| 790 |
""")
|
|
|
|
| 792 |
interface.launch()
|
| 793 |
|
| 794 |
if __name__ == "__main__":
|
| 795 |
+
create_interface()
|