- Every provider can look an entry up again by its ID (TMDB, TheTVDB,
IGDB, Deezer, MusicBrainz, Wikipedia); search and lookup share parsing
- POST /api/items/{id}/refresh re-applies title, subtitle, year,
description, link, details and artwork. Kept: the "why" note, rank,
theater production/venue/cast and a theater entry's year, the Deezer
preview match. Empty source fields don't erase existing values
- New items.image_custom column (migration 4; existing uploads marked)
records artwork the owner chose; refresh keeps it unless asked
- Refused for custom lists and hand-added entries; entries the source
dropped are reported, and a refresh whose title shares no words with
the current one is rejected as a likely bad ID
- Editor: refresh button per row (asks about the owner's own artwork),
and "Refresh all" with a confirm step, replace-my-art checkbox,
progress with Stop, and a summary of problems
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
51 lines
2.7 KiB
HTML
51 lines
2.7 KiB
HTML
{{define "bodyclass"}}page-admin{{end}}
|
|
{{define "content"}}
|
|
{{$c := category .Data.List.Category}}
|
|
<div class="container admin">
|
|
<a class="back-link" href="/admin">{{icon "arrow-left"}}All lists</a>
|
|
<header class="admin-head">
|
|
<div class="admin-head-title">
|
|
<span class="shelf-icon">{{icon $c.Icon}}</span>
|
|
<div>
|
|
<h1 data-bind="title">{{.Data.List.Title}}</h1>
|
|
<p class="muted"><span data-bind="count">{{.Data.List.ItemCount}}</span> of <span data-bind="max">{{.Data.List.MaxItems}}</span> · {{$c.Label}}<span data-bind="hidden">{{if not .Data.List.Visible}} · Hidden{{end}}</span></p>
|
|
</div>
|
|
</div>
|
|
<div class="admin-head-actions">
|
|
<a class="btn btn--ghost" data-bind="public" href="/l/{{.Data.List.Slug}}">{{icon "external"}}View</a>
|
|
{{template "export" .Data.List.Slug}}
|
|
{{if ne $c.Key "custom"}}<button class="btn btn--ghost" type="button" data-action="refresh-all" title="Pull the latest details and artwork from each entry's source">{{icon "refresh"}}Refresh all</button>{{end}}
|
|
<button class="btn" type="button" data-action="edit-list">{{icon "settings"}}List settings</button>
|
|
</div>
|
|
</header>
|
|
<div class="meter" aria-hidden="true"><span data-bind="meter" style="width: {{pct .Data.List.ItemCount .Data.List.MaxItems}}%"></span></div>
|
|
|
|
<div class="editor">
|
|
<section class="panel editor-search" aria-labelledby="add-h">
|
|
<div class="panel-head">
|
|
<h2 id="add-h">{{if eq $c.Key "custom"}}Add favorites{{else}}Add {{$c.Label}}{{end}}</h2>
|
|
<span class="muted small" data-bind="provider"></span>
|
|
</div>
|
|
<form class="search-bar" data-search role="search">
|
|
{{icon "search"}}
|
|
<input type="search" name="q" placeholder="{{if eq $c.Key "custom"}}Search Wikipedia (optional)…{{else}}Search for a {{$c.Singular}}…{{end}}" autocomplete="off" aria-label="Search">
|
|
<span class="spinner" hidden></span>
|
|
</form>
|
|
<div class="search-results" data-results aria-live="polite"></div>
|
|
<button type="button" class="btn btn--ghost btn--block" data-action="manual">{{icon "pencil"}}Add one manually</button>
|
|
</section>
|
|
|
|
<section class="panel editor-items" aria-labelledby="items-h">
|
|
<div class="panel-head">
|
|
<h2 id="items-h">Ranking</h2>
|
|
<span class="muted small">Drag, use the arrows, or type a new rank.</span>
|
|
</div>
|
|
<ol class="rank-list" data-rank-list></ol>
|
|
<nav class="pager" data-pager aria-label="Pages"></nav>
|
|
</section>
|
|
</div>
|
|
</div>
|
|
<script type="application/json" id="boot">{{.Data.Boot}}</script>
|
|
{{end}}
|
|
{{define "scripts"}}<script type="module" src="/static/js/admin-list.js?v={{.AssetVer}}"></script>{{end}}
|