Show a watch's failure on its row, not in an alert()

A failed "Get files" popped a browser alert: jarring, and the message is gone
the moment you dismiss it — which matters here, because the message explains
MakerWorld's download limit. It now appears on the watch's row until the next
attempt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
dlawler489 2026-09-16 13:55:41 +10:00
parent be8776bbce
commit fc5e81006b

View file

@ -2178,6 +2178,10 @@ function watchPanelHtml() {
const WATCH_STATUS = { ok: 'Up to date', checking: 'Checking…', error: 'Problem' };
// What went wrong with the last thing you asked a watch to do, shown on its row
// until the next attempt. Beats an alert() you can't read once it's dismissed.
const watchNotices = new Map();
function watchHtml(w) {
const when = w.last_checked_at ? `checked ${formatDate(w.last_checked_at)}` : 'not checked yet';
const listed = w.total != null && w.listed != null && w.listed < w.total
@ -2199,6 +2203,7 @@ function watchHtml(w) {
<div class="watch-meta">${escapeHtml(when)} · every ${w.interval_hours}h · ${plural(w.imported_count, 'model')} imported${w.partial_count ? ` · ${w.partial_count} still without files` : ''}${w.error_count ? ` · ${w.error_count} failed` : ''}${listed}</div>
${w.last_error ? `<div class="ai-run-error">${escapeHtml(w.last_error)}
${w.last_error_reason === 'makerworld_token' ? '<button type="button" class="btn btn-primary btn-sm" data-watch="token">Update token</button>' : ''}</div>` : ''}
${watchNotices.has(w.id) ? `<div class="ai-run-error">${escapeHtml(watchNotices.get(w.id))}</div>` : ''}
${recent.length ? `<div class="watch-recent">${recent.map((i) => `
<span>${i.model_id
? `<button type="button" class="link-btn" data-open-model="${i.model_id}">${escapeHtml(i.model_name || i.title || `Model ${i.model_id}`)}</button>`
@ -2288,6 +2293,7 @@ async function handleWatchAction(btn) {
const id = Number(btn.closest('[data-watch-id]').dataset.watchId);
const action = btn.dataset.watch;
btn.disabled = true;
watchNotices.delete(id); // this attempt replaces whatever the last one said
try {
if (action === 'check') {
await postJson(`/api/watches/${id}/check`);
@ -2309,7 +2315,7 @@ async function handleWatchAction(btn) {
if (err.message && /token/i.test(err.message)) {
promptMakerworldToken(err.message, () => retryWatchCheck(id), 'Save & check collection');
} else {
alert(err.message);
watchNotices.set(id, err.message);
}
}
refreshWatches();