url upload better

This commit is contained in:
2026-07-14 21:05:02 +02:00
parent 0c6132a2b9
commit b5d688ec0d
2 changed files with 8 additions and 83 deletions

View File

@@ -1652,39 +1652,3 @@
} }
@keyframes uutShimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } } @keyframes uutShimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } }
/* ── Completion states (inline, auto-dismiss) ────── */
.uut-ok { color: #51cf66; font-size: 10px; flex-shrink: 0; }
.uut-err { color: #ff5050; font-size: 10px; flex-shrink: 0; }
.uut-job-row--done { align-items: center; }
.uut-job--success .uut-bar-fill,
.uut-bar-fill--ok {
background: #51cf66;
background-image: none;
animation: none;
}
.uut-job--error .uut-bar-fill,
.uut-bar-fill--err {
background: #ff5050;
background-image: none;
animation: none;
}
.uut-stage--ok { color: #51cf66; }
.uut-stage--err { color: #ff5050; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 180px; display: block; }
.uut-link {
font-size: 0.69rem;
color: var(--accent);
text-decoration: none;
opacity: 0.85;
white-space: nowrap;
transition: opacity 0.15s;
margin-left: 5px;
}
.uut-link:hover { opacity: 1; text-decoration: underline; }

View File

@@ -113,41 +113,6 @@ window.escapeHtmlUpload = window.escapeHtmlUpload || ((unsafe) => {
} }
}; };
const _renderDone = (jobId, success, itemId, errMsg) => {
const list = _$('uut-active-list');
if (!list) return;
const row = list.querySelector(`[data-jid="${CSS.escape(jobId)}"]`);
if (!row) return;
const t = i18n();
const url = window.escapeHtmlUpload(_active.get(jobId)?.url || '');
if (success) {
row.classList.add('uut-job--success');
const linkText = t.url_tracker_view || 'View →';
const link = itemId ? ` <a class="uut-link" href="/${itemId}">${window.escapeHtmlUpload(linkText)}</a>` : '';
const completeText = t.url_tracker_complete || 'Complete!';
row.innerHTML = `
<div class="uut-job-row">
<div class="uut-job-info">
<span class="uut-url" title="${url}">${url}</span>
<div class="uut-meta"><span class="uut-stage uut-stage--ok">${window.escapeHtmlUpload(completeText)}${link}</span></div>
</div>
</div>
`;
} else {
row.classList.add('uut-job--error');
const safeErr = window.escapeHtmlUpload(errMsg || t.url_tracker_failed || 'Upload failed');
row.innerHTML = `
<div class="uut-job-row">
<div class="uut-job-info">
<span class="uut-url" title="${url}">${url}</span>
<div class="uut-meta"><span class="uut-stage uut-stage--err" title="${safeErr}">${safeErr}</span></div>
</div>
</div>
`;
}
};
// ── Polling ─────────────────────────────────────────────────────────────── // ── Polling ───────────────────────────────────────────────────────────────
const _stopPoll = (jobId) => { const _stopPoll = (jobId) => {
const j = _active.get(jobId); const j = _active.get(jobId);
@@ -179,7 +144,7 @@ window.escapeHtmlUpload = window.escapeHtmlUpload || ((unsafe) => {
data: state.error ? { msg: state.error } : null data: state.error ? { msg: state.error } : null
}); });
} }
}, 2000); }, 500);
return; return;
} }
} catch {} } catch {}
@@ -196,12 +161,10 @@ window.escapeHtmlUpload = window.escapeHtmlUpload || ((unsafe) => {
_stopPoll(jobId); _stopPoll(jobId);
_broadcast({ type: 'job_resolved', jobId, notif }); _broadcast({ type: 'job_resolved', jobId, notif });
const success = notif.type === 'upload_success'; // Fade row out and remove — no lingering done state
const itemId = notif.item_id || null; const row = _$('uut-active-list')?.querySelector(`[data-jid="${CSS.escape(jobId)}"]`);
const errMsg = notif.data?.msg || 'Upload failed'; if (row) { row.classList.add('uut-job--fading'); setTimeout(() => row.remove(), 300); }
setTimeout(() => { _active.delete(jobId); _sync(); }, 350);
_renderDone(jobId, success, itemId, errMsg);
_sync(); // update badge count
}; };
// ── Public API ──────────────────────────────────────────────────────────── // ── Public API ────────────────────────────────────────────────────────────
@@ -209,8 +172,6 @@ window.escapeHtmlUpload = window.escapeHtmlUpload || ((unsafe) => {
if (!jobId) jobId = `local_${Date.now()}`; if (!jobId) jobId = `local_${Date.now()}`;
_ensurePanel(); _ensurePanel();
_closed = false; _closed = false;
// Clean up any stale resolved entries from a previous session
for (const [id, j] of _active) { if (j.resolved) _active.delete(id); }
_active.set(jobId, { url, percent: 0, stage: 'queued', speed: null, eta: null, resolved: false, pollTimer: null }); _active.set(jobId, { url, percent: 0, stage: 'queued', speed: null, eta: null, resolved: false, pollTimer: null });
_renderJob(jobId); _renderJob(jobId);
_sync(); _sync();
@@ -259,9 +220,9 @@ window.escapeHtmlUpload = window.escapeHtmlUpload || ((unsafe) => {
const job = _active.get(data.jobId); const job = _active.get(data.jobId);
if (!job?._remote) break; if (!job?._remote) break;
job.resolved = true; job.resolved = true;
const n = data.notif || {}; const row = _$('uut-active-list')?.querySelector(`[data-jid="${CSS.escape(data.jobId)}"]`);
_renderDone(data.jobId, n.type === 'upload_success', n.item_id || null, n.data?.msg || 'Upload failed'); if (row) { row.classList.add('uut-job--fading'); setTimeout(() => row.remove(), 300); }
_sync(); setTimeout(() => { _active.delete(data.jobId); _sync(); }, 350);
break; break;
} }
} }