Fix catalog-price-check.js served from wrong wwwroot
File was written to repo-root wwwroot/ instead of src/PowderCoating.Web/wwwroot/ — causing a 404 and MIME type refusal. Moved to the correct location. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
var form = document.getElementById('runForm');
|
||||
var btn = document.getElementById('runBtn');
|
||||
var overlay = document.getElementById('price-check-overlay');
|
||||
var bar = document.getElementById('overlay-bar');
|
||||
var pctLabel = document.getElementById('overlay-pct');
|
||||
var statusMsg = document.getElementById('overlay-status');
|
||||
|
||||
if (!form || !btn || !overlay) return;
|
||||
|
||||
// Estimate total seconds based on item count (roughly 12s per batch of 25, min 15s).
|
||||
function estimateDuration(itemCount) {
|
||||
var batches = Math.max(1, Math.ceil(itemCount / 25));
|
||||
return Math.max(15, batches * 12);
|
||||
}
|
||||
|
||||
// Messages keyed to approximate progress milestones (0–100).
|
||||
function messageAt(pct, batchCount) {
|
||||
if (pct < 10) return 'Loading catalog items…';
|
||||
if (pct < 20) return 'Sending items to Claude…';
|
||||
if (batchCount <= 1) {
|
||||
if (pct < 75) return 'Analyzing your catalog with AI…';
|
||||
if (pct < 92) return 'Reviewing pricing data…';
|
||||
} else {
|
||||
var batchDone = Math.floor((pct / 100) * batchCount);
|
||||
if (batchDone < batchCount) {
|
||||
return 'Analyzing batch ' + (batchDone + 1) + ' of ' + batchCount + '…';
|
||||
}
|
||||
}
|
||||
if (pct < 97) return 'Compiling results…';
|
||||
return 'Almost done…';
|
||||
}
|
||||
|
||||
function setProgress(pct, batchCount) {
|
||||
var clamped = Math.min(99, Math.max(0, pct));
|
||||
bar.style.width = clamped + '%';
|
||||
pctLabel.textContent = Math.round(clamped);
|
||||
statusMsg.textContent = messageAt(clamped, batchCount);
|
||||
}
|
||||
|
||||
form.addEventListener('submit', function () {
|
||||
btn.disabled = true;
|
||||
|
||||
var itemCount = parseInt(btn.getAttribute('data-item-count') || '0', 10);
|
||||
var batchCount = Math.max(1, Math.ceil(itemCount / 25));
|
||||
var totalSecs = estimateDuration(itemCount);
|
||||
|
||||
overlay.classList.add('active');
|
||||
setProgress(0, batchCount);
|
||||
|
||||
// Animate progress: fast to ~85%, then slow crawl toward 99%.
|
||||
// Uses two easing phases so it never "finishes" before the server responds.
|
||||
var start = Date.now();
|
||||
var phase1End = totalSecs * 0.80 * 1000; // 80% of time -> 85% progress
|
||||
var raf;
|
||||
|
||||
function tick() {
|
||||
var elapsed = Date.now() - start;
|
||||
var pct;
|
||||
|
||||
if (elapsed < phase1End) {
|
||||
// Phase 1: ease-out from 0 -> 85
|
||||
var t = elapsed / phase1End;
|
||||
pct = 85 * (1 - Math.pow(1 - t, 2));
|
||||
} else {
|
||||
// Phase 2: slow crawl 85 -> 99 (never quite reaches 99)
|
||||
var t2 = (elapsed - phase1End) / (totalSecs * 1000);
|
||||
pct = 85 + 14 * (1 - Math.exp(-t2 * 1.5));
|
||||
}
|
||||
|
||||
setProgress(pct, batchCount);
|
||||
raf = requestAnimationFrame(tick);
|
||||
}
|
||||
|
||||
raf = requestAnimationFrame(tick);
|
||||
|
||||
// The page navigation itself tears down the overlay; cancel the RAF to avoid
|
||||
// running after the page is gone.
|
||||
window.addEventListener('pagehide', function () {
|
||||
cancelAnimationFrame(raf);
|
||||
});
|
||||
});
|
||||
}());
|
||||
Reference in New Issue
Block a user