Files
jellybit/web/templates/partials/review_source_block.html
T
avandClaude Opus 4.8 847d471852 Ревью: oob-обновление панели действий при свопе источника
Кнопка «Применить» (завязана на HasLinks) лежит вне #source-block и не
обновлялась при htmx-свопе выбора источника — в краевом случае (пустой
предпросмотр из-за коллизии) рассинхронивалась с превью до полной
перезагрузки. Выделил панель в партиал review_action_bar с id=action-bar;
reviewBlockAction теперь рендерит review_source_swap — свежий #source-block
плюс oob-копию панели (hx-swap-oob), так кнопка синхронно отражает HasLinks.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 09:28:45 +03:00

81 lines
4.4 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{{define "review_source_block"}}
<div class="section" id="source-block">
<div class="section-head">
<h2>Источник и раскладка</h2>
<span class="hint">выбери вариант — инфо и раскладка обновятся сразу</span>
</div>
{{if .BlockError}}
<div class="block-error">{{.BlockError}}</div>
{{end}}
<!-- 1. Список вариантов: клик по строке = выбор + сохранение (htmx) -->
<div class="cand-list">
{{range .Sources}}
<div class="cand{{if .Active}} selected{{end}}{{if eq .Kind "neural"}} nn-cand{{end}}">
<label class="cand-pick">
<input class="cand-radio" type="radio" name="candidate_id"
value="{{if eq .Kind "neural"}}{{else}}{{.CandidateID}}{{end}}"
{{if .Active}}checked{{end}}
hx-post="/ui/downloads/{{$.ID}}/{{if eq .Kind "neural"}}nobase{{else}}candidate{{end}}"
hx-trigger="change"
hx-target="#source-block"
hx-swap="outerHTML">
<span class="radio"></span>
<div class="body">
{{if eq .Kind "neural"}}
<div class="name"><span class="prov nn">нейронка</span> распознано нейронкой</div>
<div class="sub">без базы — тег папки не ставится</div>
{{else}}
<div class="name"><span class="prov {{.Provider}}">{{.Provider}}</span> {{if .Title}}{{.Title}}{{else}}<span class="faint">id {{.ProviderID}}</span>{{end}}{{if .Year}} <span class="muted">· {{.Year}}</span>{{end}}</div>
<div class="sub">id {{.ProviderID}}</div>
{{end}}
</div>
</label>
{{if .MatchURL}}<a class="ext-link" href="{{.MatchURL}}" target="_blank" rel="noopener">запись ↗</a>{{end}}
</div>
{{end}}
</div>
<!-- Ручное добавление источника -->
<form class="cand-extra" hx-post="/ui/downloads/{{.ID}}/source"
hx-target="#source-block" hx-swap="outerHTML">
<select class="select" name="provider" style="max-width:120px">
<option value="tmdb">TMDB</option>
<option value="tvdb">TVDB</option>
<option value="imdb">IMDb</option>
</select>
<input class="input mono" name="provider_id" placeholder="id или URL записи (для TVDB — числовой id)" required>
<button class="btn btn-sm" type="submit">Добавить</button>
</form>
<!-- 2. Инфо о выбранном источнике (тип read-only) -->
<div class="src-info">
<div class="field"><span class="label">Тип</span><div>{{if .IsSeries}}сериал{{else}}фильм{{end}}</div></div>
<div class="field"><span class="label">Название</span><div>{{.Title}}</div></div>
{{if .OriginalTitle}}<div class="field"><span class="label">Ориг. название</span><div class="mono">{{.OriginalTitle}}</div></div>{{end}}
{{if .Year}}<div class="field"><span class="label">Год</span><div>{{.Year}}</div></div>{{end}}
{{if .IsSeries}}<div class="field"><span class="label">Сезоны</span><div>{{if .SeasonSummary}}{{.SeasonSummary}}{{else}}<span class="faint"></span>{{end}}</div></div>{{end}}
<div class="field"><span class="label">Режиссёр</span><div><span class="faint"></span></div></div>
</div>
<!-- 3. Предпросмотр раскладки выбранного источника -->
<div class="src-layout">
<div class="section-head" style="margin-bottom:var(--sp-3)">
<h3 class="sub-head">Раскладка</h3>
<span class="hint">файл источника → целевой хардлинк</span>
</div>
{{template "layout_widget" .Files}}
<p class="faint" style="font-size:var(--fs-xs);margin:var(--sp-3) 0 0">
Буквальные целевые пути. Применяются как хардлинки — исходник остаётся на раздаче.
</p>
</div>
</div>
{{end}}
{{/* Ответ на своп выбора источника: свежий #source-block + oob-обновление
панели действий (#action-bar), чтобы кнопка «Применить» синхронно отражала
актуальный HasLinks. Рендерится с ActionBarOOB=true (reviewBlockAction). */}}
{{define "review_source_swap"}}{{template "review_source_block" .}}
{{template "review_action_bar" .}}{{end}}