Skip to content

Commit 59bf673

Browse files
committed
Uploader better error display, handling
1 parent 91a6d4c commit 59bf673

2 files changed

Lines changed: 35 additions & 14 deletions

File tree

server/installer/file-uploader/app.py

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -553,12 +553,13 @@ def on_progress(sent: int, total: int) -> None:
553553
pass
554554

555555
def worker():
556-
streamer = CANTimescaleStreamer(
557-
postgres_dsn=POSTGRES_DSN,
558-
table=season.lower(),
559-
dbc_path=dbc_temp_path,
560-
)
556+
streamer = None
561557
try:
558+
streamer = CANTimescaleStreamer(
559+
postgres_dsn=POSTGRES_DSN,
560+
table=season.lower(),
561+
dbc_path=dbc_temp_path,
562+
)
562563
asyncio.run(
563564
streamer.stream_multiple_csvs(
564565
file_data=file_data,
@@ -568,14 +569,16 @@ def worker():
568569
)
569570
except Exception as e:
570571
error_logger.error(traceback.format_exc())
571-
PROGRESS[task_id]["msg"] = f"Error: {e}"
572-
PROGRESS[task_id]["done"] = True
572+
PROGRESS[task_id]["msg"] = f"Error: {e}"
573+
PROGRESS[task_id]["error"] = str(e)
574+
PROGRESS[task_id]["done"] = True
573575
slack.fail(str(e))
574576
finally:
575-
try:
576-
streamer.close()
577-
except Exception as e:
578-
print("error closing streamer", e)
577+
if streamer:
578+
try:
579+
streamer.close()
580+
except Exception as e:
581+
print("error closing streamer", e)
579582
if dbc_temp_path and os.path.exists(dbc_temp_path):
580583
try:
581584
os.unlink(dbc_temp_path)

server/installer/file-uploader/static/index.js

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,9 @@ function handleProgress(task_id, fileName, season) {
165165
canSubmit = false;
166166
localStorage.setItem(STORAGE_KEY, task_id);
167167
setDropZoneState("uploading");
168+
const errBox = document.getElementById("upload-error-box");
169+
if (errBox) errBox.style.display = "none";
170+
document.getElementById("progress-bar").style.background = "";
168171

169172
// Show safe-to-close banner immediately
170173
if (fileName || season) showSafeToCloseBanner(fileName, season);
@@ -194,9 +197,24 @@ function handleProgress(task_id, fileName, season) {
194197
localStorage.removeItem(STORAGE_KEY);
195198
hideSafeToCloseBanner();
196199

197-
document.getElementById("progress-bar_pct").innerText = "Done ✓";
198-
document.getElementById("progress-bar_count").innerText =
199-
data.total ? `${data.total.toLocaleString()} rows written` : "Complete";
200+
if (data.error) {
201+
document.getElementById("progress-bar_pct").innerText = "Failed ✗";
202+
document.getElementById("progress-bar").style.background = "#b91c1c";
203+
document.getElementById("progress-bar_count").innerText = "";
204+
const errBox = document.getElementById("upload-error-box") || (() => {
205+
const el = document.createElement("div");
206+
el.id = "upload-error-box";
207+
el.style.cssText = "margin-top:10px;padding:10px 14px;background:#450a0a;border:1px solid #b91c1c;border-radius:6px;color:#fca5a5;font-size:0.85em;white-space:pre-wrap;word-break:break-word;";
208+
document.querySelector(".progress-bar_parent").after(el);
209+
return el;
210+
})();
211+
errBox.innerText = "❌ Upload failed:\n" + data.error;
212+
errBox.style.display = "block";
213+
} else {
214+
document.getElementById("progress-bar_pct").innerText = "Done ✓";
215+
document.getElementById("progress-bar_count").innerText =
216+
data.total ? `${data.total.toLocaleString()} rows written` : "Complete";
217+
}
200218

201219
["drop_zone-input", "season-select", "dbc-select", "dbc-input"].forEach((id) => {
202220
const el = document.getElementById(id);

0 commit comments

Comments
 (0)