Spaces:
Sleeping
Sleeping
Commit ·
216e4eb
1
Parent(s): 82f4285
Fix before/after slider in result modal: wait for image load, handle missing thumbnails
Browse files- static/js/app.js +36 -4
- templates/index.html +1 -1
static/js/app.js
CHANGED
|
@@ -397,17 +397,49 @@ function showResult(data) {
|
|
| 397 |
|
| 398 |
const beforeImg = document.getElementById('compare-before-img');
|
| 399 |
const afterImg = document.getElementById('compare-after-img');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 400 |
if (data.overlayBase64Png) {
|
|
|
|
| 401 |
afterImg.src = 'data:image/png;base64,' + data.overlayBase64Png;
|
| 402 |
const beforeFile = document.getElementById('file-before').files?.[0];
|
| 403 |
-
if (beforeFile)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 404 |
} else {
|
|
|
|
| 405 |
afterImg.src = data.overlayUrl || '';
|
| 406 |
-
|
|
|
|
|
|
|
|
|
|
| 407 |
}
|
| 408 |
|
| 409 |
-
|
| 410 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 411 |
|
| 412 |
tbody.innerHTML = '';
|
| 413 |
const regions = (data.regions || []).slice(0, 50);
|
|
|
|
| 397 |
|
| 398 |
const beforeImg = document.getElementById('compare-before-img');
|
| 399 |
const afterImg = document.getElementById('compare-after-img');
|
| 400 |
+
|
| 401 |
+
// "Before" side = original before image, "After" side = result overlay
|
| 402 |
+
const sliderSection = document.querySelector('.zoom-slider-section');
|
| 403 |
+
let hasBefore = false;
|
| 404 |
+
|
| 405 |
if (data.overlayBase64Png) {
|
| 406 |
+
// Fresh detection: result image is base64, before image from file picker
|
| 407 |
afterImg.src = 'data:image/png;base64,' + data.overlayBase64Png;
|
| 408 |
const beforeFile = document.getElementById('file-before').files?.[0];
|
| 409 |
+
if (beforeFile) {
|
| 410 |
+
hasBefore = true;
|
| 411 |
+
readFileAsDataURL(beforeFile).then((url) => { beforeImg.src = url; });
|
| 412 |
+
} else if (data.beforeThumbUrl) {
|
| 413 |
+
hasBefore = true;
|
| 414 |
+
beforeImg.src = data.beforeThumbUrl;
|
| 415 |
+
}
|
| 416 |
} else {
|
| 417 |
+
// Loading from history: use stored URLs
|
| 418 |
afterImg.src = data.overlayUrl || '';
|
| 419 |
+
if (data.beforeThumbUrl) {
|
| 420 |
+
hasBefore = true;
|
| 421 |
+
beforeImg.src = data.beforeThumbUrl;
|
| 422 |
+
}
|
| 423 |
}
|
| 424 |
|
| 425 |
+
// If no before image available, still show the overlay but hide the slider handle
|
| 426 |
+
if (!hasBefore) {
|
| 427 |
+
beforeImg.src = afterImg.src;
|
| 428 |
+
}
|
| 429 |
+
|
| 430 |
+
// Wait for images to load before positioning the slider, then reset
|
| 431 |
+
let loaded = 0;
|
| 432 |
+
const onReady = () => {
|
| 433 |
+
loaded++;
|
| 434 |
+
if (loaded >= 2) {
|
| 435 |
+
resetCompareSlider();
|
| 436 |
+
resetZoom();
|
| 437 |
+
}
|
| 438 |
+
};
|
| 439 |
+
afterImg.onload = onReady;
|
| 440 |
+
beforeImg.onload = onReady;
|
| 441 |
+
// Fallback for cached images (onload won't fire if already loaded)
|
| 442 |
+
setTimeout(() => { resetCompareSlider(); resetZoom(); }, 400);
|
| 443 |
|
| 444 |
tbody.innerHTML = '';
|
| 445 |
const regions = (data.regions || []).slice(0, 50);
|
templates/index.html
CHANGED
|
@@ -345,6 +345,6 @@
|
|
| 345 |
</div>
|
| 346 |
</div>
|
| 347 |
|
| 348 |
-
<script src="/static/js/app.js?v=
|
| 349 |
</body>
|
| 350 |
</html>
|
|
|
|
| 345 |
</div>
|
| 346 |
</div>
|
| 347 |
|
| 348 |
+
<script src="/static/js/app.js?v=18"></script>
|
| 349 |
</body>
|
| 350 |
</html>
|