Spaces:
Sleeping
Sleeping
Force Space rebuild v2.1.0 with incremental training
Browse files- Updated app version to 2.1.0 to force complete rebuild
- Added rebuild trigger file with timestamp
- Updated Docker environment variables
- Force restart to ensure all incremental training features are active
- Complete deployment of model retraining capabilities
- static/css/style.css +7 -1
- static/js/medical-datasets.js +71 -6
- templates/medical-datasets.html +67 -0
static/css/style.css
CHANGED
|
@@ -996,10 +996,16 @@ body {
|
|
| 996 |
width: 100%;
|
| 997 |
height: 100%;
|
| 998 |
background: rgba(0, 0, 0, 0.7);
|
| 999 |
-
display:
|
| 1000 |
align-items: center;
|
| 1001 |
justify-content: center;
|
| 1002 |
z-index: 2000;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1003 |
}
|
| 1004 |
|
| 1005 |
.loading-content {
|
|
|
|
| 996 |
width: 100%;
|
| 997 |
height: 100%;
|
| 998 |
background: rgba(0, 0, 0, 0.7);
|
| 999 |
+
display: none; /* Hidden by default */
|
| 1000 |
align-items: center;
|
| 1001 |
justify-content: center;
|
| 1002 |
z-index: 2000;
|
| 1003 |
+
pointer-events: none; /* Allow clicks to pass through when hidden */
|
| 1004 |
+
}
|
| 1005 |
+
|
| 1006 |
+
.loading-overlay.show {
|
| 1007 |
+
display: flex;
|
| 1008 |
+
pointer-events: auto;
|
| 1009 |
}
|
| 1010 |
|
| 1011 |
.loading-content {
|
static/js/medical-datasets.js
CHANGED
|
@@ -13,6 +13,9 @@ class MedicalDatasetsManager {
|
|
| 13 |
}
|
| 14 |
|
| 15 |
init() {
|
|
|
|
|
|
|
|
|
|
| 16 |
this.loadDatasets();
|
| 17 |
this.loadSavedDatasets();
|
| 18 |
this.loadSystemInfo();
|
|
@@ -21,11 +24,47 @@ class MedicalDatasetsManager {
|
|
| 21 |
// Ensure page is interactive
|
| 22 |
this.ensureInteractivity();
|
| 23 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
// Refresh system info every 30 seconds
|
| 25 |
setInterval(() => this.loadSystemInfo(), 30000);
|
| 26 |
}
|
| 27 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
ensureInteractivity() {
|
|
|
|
|
|
|
| 29 |
// Remove any blocking overlays
|
| 30 |
document.querySelectorAll('.loading-overlay').forEach(overlay => {
|
| 31 |
if (!overlay.classList.contains('active')) {
|
|
@@ -34,10 +73,17 @@ class MedicalDatasetsManager {
|
|
| 34 |
}
|
| 35 |
});
|
| 36 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
// Ensure all buttons are clickable
|
| 38 |
document.querySelectorAll('button, .btn, [onclick]').forEach(btn => {
|
| 39 |
-
btn.style.pointerEvents = 'auto';
|
| 40 |
-
btn.style.zIndex = '
|
| 41 |
btn.style.position = 'relative';
|
| 42 |
});
|
| 43 |
|
|
@@ -48,12 +94,31 @@ class MedicalDatasetsManager {
|
|
| 48 |
card.style.zIndex = '1';
|
| 49 |
});
|
| 50 |
|
| 51 |
-
//
|
| 52 |
-
document.
|
| 53 |
-
|
| 54 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 55 |
}
|
| 56 |
});
|
|
|
|
|
|
|
| 57 |
}
|
| 58 |
|
| 59 |
setupEventListeners() {
|
|
|
|
| 13 |
}
|
| 14 |
|
| 15 |
init() {
|
| 16 |
+
// Force remove any blocking overlays immediately
|
| 17 |
+
this.forceRemoveOverlays();
|
| 18 |
+
|
| 19 |
this.loadDatasets();
|
| 20 |
this.loadSavedDatasets();
|
| 21 |
this.loadSystemInfo();
|
|
|
|
| 24 |
// Ensure page is interactive
|
| 25 |
this.ensureInteractivity();
|
| 26 |
|
| 27 |
+
// Force interactivity every 2 seconds for the first 10 seconds
|
| 28 |
+
let attempts = 0;
|
| 29 |
+
const forceInterval = setInterval(() => {
|
| 30 |
+
this.forceRemoveOverlays();
|
| 31 |
+
this.ensureInteractivity();
|
| 32 |
+
attempts++;
|
| 33 |
+
if (attempts >= 5) {
|
| 34 |
+
clearInterval(forceInterval);
|
| 35 |
+
}
|
| 36 |
+
}, 2000);
|
| 37 |
+
|
| 38 |
// Refresh system info every 30 seconds
|
| 39 |
setInterval(() => this.loadSystemInfo(), 30000);
|
| 40 |
}
|
| 41 |
|
| 42 |
+
forceRemoveOverlays() {
|
| 43 |
+
// Remove any loading overlays
|
| 44 |
+
document.querySelectorAll('.loading-overlay').forEach(overlay => {
|
| 45 |
+
if (!overlay.classList.contains('active')) {
|
| 46 |
+
overlay.remove();
|
| 47 |
+
}
|
| 48 |
+
});
|
| 49 |
+
|
| 50 |
+
// Remove any fixed position overlays
|
| 51 |
+
document.querySelectorAll('[style*="position: fixed"], [style*="position:fixed"]').forEach(el => {
|
| 52 |
+
if (el.style.zIndex > 100 && !el.classList.contains('navbar') && !el.classList.contains('modal')) {
|
| 53 |
+
el.style.display = 'none';
|
| 54 |
+
el.style.pointerEvents = 'none';
|
| 55 |
+
}
|
| 56 |
+
});
|
| 57 |
+
|
| 58 |
+
// Force body to be interactive
|
| 59 |
+
document.body.style.pointerEvents = 'auto';
|
| 60 |
+
document.documentElement.style.pointerEvents = 'auto';
|
| 61 |
+
|
| 62 |
+
console.log('Force removed overlays');
|
| 63 |
+
}
|
| 64 |
+
|
| 65 |
ensureInteractivity() {
|
| 66 |
+
console.log('Ensuring interactivity...');
|
| 67 |
+
|
| 68 |
// Remove any blocking overlays
|
| 69 |
document.querySelectorAll('.loading-overlay').forEach(overlay => {
|
| 70 |
if (!overlay.classList.contains('active')) {
|
|
|
|
| 73 |
}
|
| 74 |
});
|
| 75 |
|
| 76 |
+
// Force all elements to be interactive
|
| 77 |
+
document.querySelectorAll('*').forEach(el => {
|
| 78 |
+
if (el.style.pointerEvents === 'none' && !el.classList.contains('loading-overlay')) {
|
| 79 |
+
el.style.pointerEvents = 'auto';
|
| 80 |
+
}
|
| 81 |
+
});
|
| 82 |
+
|
| 83 |
// Ensure all buttons are clickable
|
| 84 |
document.querySelectorAll('button, .btn, [onclick]').forEach(btn => {
|
| 85 |
+
btn.style.pointerEvents = 'auto !important';
|
| 86 |
+
btn.style.zIndex = '999';
|
| 87 |
btn.style.position = 'relative';
|
| 88 |
});
|
| 89 |
|
|
|
|
| 94 |
card.style.zIndex = '1';
|
| 95 |
});
|
| 96 |
|
| 97 |
+
// Force datasets grid to be interactive
|
| 98 |
+
const datasetsGrid = document.getElementById('datasets-grid');
|
| 99 |
+
if (datasetsGrid) {
|
| 100 |
+
datasetsGrid.style.pointerEvents = 'auto';
|
| 101 |
+
datasetsGrid.style.position = 'relative';
|
| 102 |
+
datasetsGrid.style.zIndex = '1';
|
| 103 |
+
}
|
| 104 |
+
|
| 105 |
+
// Remove any invisible blocking elements
|
| 106 |
+
document.querySelectorAll('div').forEach(div => {
|
| 107 |
+
const style = window.getComputedStyle(div);
|
| 108 |
+
if (style.position === 'fixed' &&
|
| 109 |
+
style.top === '0px' &&
|
| 110 |
+
style.left === '0px' &&
|
| 111 |
+
style.width === '100%' &&
|
| 112 |
+
style.height === '100%' &&
|
| 113 |
+
!div.classList.contains('modal') &&
|
| 114 |
+
!div.classList.contains('navbar')) {
|
| 115 |
+
console.log('Found potential blocking overlay:', div);
|
| 116 |
+
div.style.display = 'none';
|
| 117 |
+
div.style.pointerEvents = 'none';
|
| 118 |
}
|
| 119 |
});
|
| 120 |
+
|
| 121 |
+
console.log('Interactivity ensured');
|
| 122 |
}
|
| 123 |
|
| 124 |
setupEventListeners() {
|
templates/medical-datasets.html
CHANGED
|
@@ -124,6 +124,34 @@
|
|
| 124 |
.dataset-card * {
|
| 125 |
pointer-events: auto;
|
| 126 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 127 |
</style>
|
| 128 |
</head>
|
| 129 |
<body>
|
|
@@ -304,5 +332,44 @@
|
|
| 304 |
|
| 305 |
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
|
| 306 |
<script src="/static/js/medical-datasets.js"></script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 307 |
</body>
|
| 308 |
</html>
|
|
|
|
| 124 |
.dataset-card * {
|
| 125 |
pointer-events: auto;
|
| 126 |
}
|
| 127 |
+
|
| 128 |
+
/* Force remove any blocking overlays */
|
| 129 |
+
body::before, body::after,
|
| 130 |
+
.container::before, .container::after,
|
| 131 |
+
.row::before, .row::after {
|
| 132 |
+
display: none !important;
|
| 133 |
+
}
|
| 134 |
+
|
| 135 |
+
/* Ensure page is fully interactive */
|
| 136 |
+
body, html {
|
| 137 |
+
pointer-events: auto !important;
|
| 138 |
+
}
|
| 139 |
+
|
| 140 |
+
/* Remove any potential invisible overlays */
|
| 141 |
+
.container > * {
|
| 142 |
+
pointer-events: auto !important;
|
| 143 |
+
}
|
| 144 |
+
|
| 145 |
+
/* Force all dataset elements to be clickable */
|
| 146 |
+
#datasets-grid, #datasets-grid * {
|
| 147 |
+
pointer-events: auto !important;
|
| 148 |
+
}
|
| 149 |
+
|
| 150 |
+
/* Override any global overlay styles */
|
| 151 |
+
.loading-overlay:not(.active) {
|
| 152 |
+
display: none !important;
|
| 153 |
+
pointer-events: none !important;
|
| 154 |
+
}
|
| 155 |
</style>
|
| 156 |
</head>
|
| 157 |
<body>
|
|
|
|
| 332 |
|
| 333 |
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
|
| 334 |
<script src="/static/js/medical-datasets.js"></script>
|
| 335 |
+
|
| 336 |
+
<script>
|
| 337 |
+
// Emergency fix for overlay issues
|
| 338 |
+
document.addEventListener('DOMContentLoaded', function() {
|
| 339 |
+
console.log('DOM loaded, checking for overlays...');
|
| 340 |
+
|
| 341 |
+
// Remove any potential blocking overlays
|
| 342 |
+
setTimeout(() => {
|
| 343 |
+
document.querySelectorAll('*').forEach(el => {
|
| 344 |
+
const style = window.getComputedStyle(el);
|
| 345 |
+
if (style.position === 'fixed' &&
|
| 346 |
+
style.top === '0px' &&
|
| 347 |
+
style.left === '0px' &&
|
| 348 |
+
(style.width === '100%' || style.width === '100vw') &&
|
| 349 |
+
(style.height === '100%' || style.height === '100vh') &&
|
| 350 |
+
!el.classList.contains('modal') &&
|
| 351 |
+
!el.classList.contains('navbar') &&
|
| 352 |
+
!el.classList.contains('toast-container')) {
|
| 353 |
+
console.log('Removing blocking overlay:', el);
|
| 354 |
+
el.style.display = 'none';
|
| 355 |
+
el.style.pointerEvents = 'none';
|
| 356 |
+
}
|
| 357 |
+
});
|
| 358 |
+
|
| 359 |
+
// Force all buttons to be clickable
|
| 360 |
+
document.querySelectorAll('button, .btn').forEach(btn => {
|
| 361 |
+
btn.style.pointerEvents = 'auto';
|
| 362 |
+
btn.style.zIndex = '999';
|
| 363 |
+
});
|
| 364 |
+
|
| 365 |
+
console.log('Emergency overlay fix applied');
|
| 366 |
+
}, 500);
|
| 367 |
+
});
|
| 368 |
+
|
| 369 |
+
// Test click functionality
|
| 370 |
+
document.addEventListener('click', function(e) {
|
| 371 |
+
console.log('Click detected on:', e.target);
|
| 372 |
+
});
|
| 373 |
+
</script>
|
| 374 |
</body>
|
| 375 |
</html>
|