Make existing controls real + add robustness pass
Wire up controls that were rendered but inert, expose unused server actions, and harden the live update path. Controls now functional: - File priority dropdowns (Content tab) now persist via new setFilePriority server action - Context menu: Set location, Limit download/upload rate, Set share limit (wire setSavePath/setDownLimit/setUpLimit/setRatioLimit) - Trackers sidebar filter actually filters (snapshot now carries per-torrent trackerHosts) Robustness: - Grid updates cells in place when row order/columns are unchanged (preserves text selection/scroll, no per-second listener re-bind) - Boot retries until the server responds; SSE drops show a "Reconnecting" banner; failed actions/add/delete surface a toast - Prune selection/detail for torrents that disappear - Drop Backspace-as-delete (kept Delete) Cleanup: - Remove pseudo DHT/PeX/LSD names from the real-tracker host pool in mock data (they leaked into announce URLs and the sidebar) - Remove dead detailTab import/export Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
bc1be49a37
commit
0b35571565
5 changed files with 172 additions and 21 deletions
|
|
@ -68,10 +68,18 @@ function snapshot() {
|
|||
forceStart: t.forceStart,
|
||||
timeActive: t.timeActive,
|
||||
private: t.private,
|
||||
trackerHosts: trackerHostsOf(t),
|
||||
})),
|
||||
};
|
||||
}
|
||||
|
||||
function hostOf(url) {
|
||||
try { return new URL(url).host; } catch { return url; }
|
||||
}
|
||||
function trackerHostsOf(t) {
|
||||
return t.trackers.filter((tr) => tr.tier >= 0).map((tr) => hostOf(tr.url));
|
||||
}
|
||||
|
||||
function json(res, data, code = 200) {
|
||||
const body = JSON.stringify(data);
|
||||
res.writeHead(code, { 'Content-Type': 'application/json; charset=utf-8' });
|
||||
|
|
@ -107,6 +115,7 @@ const ACTIONS = {
|
|||
setDownLimit: (t, p) => { t.downLimit = p.limit ?? 0; },
|
||||
setUpLimit: (t, p) => { t.upLimit = p.limit ?? 0; },
|
||||
setRatioLimit: (t, p) => { t.ratioLimit = p.limit ?? -1; },
|
||||
setFilePriority: (t, p) => { if (t.files[p.index]) t.files[p.index].priority = p.priority; },
|
||||
topPriority: (t) => { t.priority = 1; },
|
||||
bottomPriority: (t) => { t.priority = 99; },
|
||||
increasePriority: (t) => { t.priority = Math.max(1, (t.priority || 1) - 1); },
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue