Веб-UI: обзор жизненного цикла в карточке загрузки
Карточка списка на главной теперь даёт краткий обзор «от загрузки до
решения об удалении»: метка «ID:» перед идентификатором, дата добавления
(абсолютная + относительная, всегда), размер раздачи и рейтинг отдачи.
Спойлер контекста убран — контекст смотрят на /download/{id}.
Данные:
- рейтинг и общий размер — из живого снимка воркера (qbt total_size →
worker.Live.TotalSize); размер доступен для любой раздачи в снимке;
- размер-фолбэк, когда торрента нет в qBittorrent (orphaned) — сумма
размеров разложенных файлов: новая колонка file_link.size, layouter
пишет размер при линковке, ридер LayoutSizeByDownload суммирует по
странице одним запросом (дедуп по dst_path);
- дата — source_added_at → фолбэк created_at, показ в TZ сервера.
handleIndex читает снимок для всех карточек (map-lookup), рейтинг/размер
статичны на рендере (без поллинга). Миграция 0007, ER-схема обновлена.
Change download-card-lifecycle-overview влит в спеки и заархивирован.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -219,6 +219,12 @@ a:hover{text-decoration:underline}
|
||||
.dl-live:empty{display:none}
|
||||
.dl-stats{margin-top:6px;font-size:var(--fs-xs);color:var(--text-dim);font-variant-numeric:tabular-nums}
|
||||
|
||||
/* обзор жизненного цикла в карточке (дата · размер · рейтинг) */
|
||||
.card-life{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:9px;
|
||||
font-size:var(--fs-xs);color:var(--text-dim);font-variant-numeric:tabular-nums}
|
||||
.card-life .ago,.card-life .sep{color:var(--text-faint)}
|
||||
.hash-label{color:var(--text-faint)}
|
||||
|
||||
/* ---------- 7. Спойлер ---------- */
|
||||
details.spoiler{margin-top:var(--sp-3)}
|
||||
.spoiler summary{cursor:pointer;color:var(--accent);font-size:var(--fs-sm);
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
<div>
|
||||
<div class="card-title"><a href="/download/{{.ID}}" style="color:inherit">{{.Title}}</a></div>
|
||||
<div class="hash-row">
|
||||
<span class="hash-label">ID:</span>
|
||||
<span class="hash">{{.ID}}</span>
|
||||
<button class="copy-btn" type="button" onclick="copyHash(this,'{{.ID}}')">⧉ копировать</button>
|
||||
</div>
|
||||
@@ -64,14 +65,15 @@
|
||||
{{template "status_badge" .State}}
|
||||
</div>
|
||||
|
||||
{{if .IsDownloading}}{{template "progress" .Progress}}{{end}}
|
||||
<div class="card-life">
|
||||
<span>{{if .Added}}{{.Added}} <span class="ago">({{.AddedAgo}})</span>{{else}}—{{end}}</span>
|
||||
<span class="sep">·</span>
|
||||
<span>{{.Size}}</span>
|
||||
<span class="sep">·</span>
|
||||
<span title="рейтинг раздачи (отдано/скачано)">↑ {{.Ratio}}</span>
|
||||
</div>
|
||||
|
||||
{{if .Context}}
|
||||
<details class="spoiler">
|
||||
<summary>контекст</summary>
|
||||
<div class="spoiler-body">«{{.Context}}»</div>
|
||||
</details>
|
||||
{{end}}
|
||||
{{if .IsDownloading}}{{template "progress" .Progress}}{{end}}
|
||||
|
||||
<div class="card-foot">
|
||||
<span class="card-meta">{{if .Note}}{{.Note}}{{else if .Error}}{{.Error}}{{end}}</span>
|
||||
|
||||
Reference in New Issue
Block a user