feat(ops): show upload percent, speed and ETA for ingest files
Build and Push Images / Build jorgecuadros-web (push) Successful in 1m46s
Build and Push Images / Build jorgecuadros-api (push) Successful in 3m3s

The ingest upload used fetch(), which cannot report request-body
progress, so the only feedback was a static "Cargando…" label — no way
to tell a stalled 2 GB upload from a working one.

Switch uploadFile() to XMLHttpRequest and expose an optional onProgress
callback reporting loaded/total bytes, a smoothed transfer rate and a
remaining-time estimate. The Operaciones ingest table renders a progress
bar row under the file being uploaded. Once the bytes are all sent the
server still has to write the file, so that tail reads "Procesando en el
servidor…" rather than parking at 100%.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-01 01:38:22 -07:00
co-authored by Claude Opus 5
parent a9b4aab7ec
commit 783ec83464
3 changed files with 244 additions and 56 deletions
+40
View File
@@ -837,6 +837,46 @@ button {
display: inline-block;
}
/* Upload progress (Operaciones ingest) */
.upload-progress {
display: flex;
flex-direction: column;
gap: 6px;
padding: 4px 0 8px;
}
.progress-track {
position: relative;
overflow: hidden;
height: 8px;
border-radius: 999px;
background: var(--paper-2);
}
.progress-fill {
height: 100%;
border-radius: 999px;
background: var(--brand-500);
transition: width 0.2s linear;
}
.progress-indeterminate .progress-fill {
width: 40% !important;
animation: progress-slide 1.2s var(--ease-out-quart) infinite;
}
@keyframes progress-slide {
0% {
transform: translateX(-100%);
}
100% {
transform: translateX(250%);
}
}
.upload-progress-stats {
display: flex;
flex-wrap: wrap;
gap: 12px;
font-size: 12px;
color: var(--muted);
}
@keyframes shimmer {
0% {
background-position: -420px 0;