Admin: show and manage highlights archived on Finished Books (restore/remove); v2.9.7
Publish Container / build (push) Successful in 15m33s
Publish Container / build (push) Successful in 15m33s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
752611d121
commit
39691aedb3
2 files changed
+31
-1
No files matched your search
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "siteforge",
|
"name": "siteforge",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "2.9.6",
|
"version": "2.9.7",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
@@ -4702,6 +4702,36 @@ const [dashboardNow, setDashboardNow] = useState(() => new Date())
|
|||||||
</select>
|
</select>
|
||||||
<p className="admin-field-help">Adds a “Study This Book” button to the playlist page and an audio-only link on the study hub.</p>
|
<p className="admin-field-help">Adds a “Study This Book” button to the playlist page and an audio-only link on the study hub.</p>
|
||||||
</div>
|
</div>
|
||||||
|
{(book.highlights ?? []).length > 0 && (
|
||||||
|
<div className="admin-field">
|
||||||
|
<label>Episode Highlights on this book's page ({(book.highlights ?? []).length})</label>
|
||||||
|
{(book.highlights ?? []).map(link => (
|
||||||
|
<div key={link.id} className="study-lesson-row">
|
||||||
|
<span className="study-lesson-ref" style={{ width: 70 }}>{link.episodeNumber ? `Ep. ${link.episodeNumber}` : '—'}</span>
|
||||||
|
<span className="study-lesson-title">{link.title || <em style={{ opacity: 0.5 }}>Untitled</em>}</span>
|
||||||
|
<div className="study-lesson-actions">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className="btn-admin-ghost"
|
||||||
|
title="Move back to the Episodes page as a General highlight so it can be edited"
|
||||||
|
onClick={() => setForm(f => ({
|
||||||
|
...f,
|
||||||
|
podcastFeaturedLinks: [...(f.podcastFeaturedLinks ?? []), { ...link, lane: 'general' as const }],
|
||||||
|
finishedBooks: (f.finishedBooks ?? []).map(b => b.id === book.id ? { ...b, highlights: (b.highlights ?? []).filter(h => h.id !== link.id) } : b),
|
||||||
|
}))}
|
||||||
|
>Restore</button>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className="btn-admin-remove"
|
||||||
|
style={{ fontSize: '0.8rem', padding: '0.2rem 0.5rem' }}
|
||||||
|
onClick={() => setForm(f => ({ ...f, finishedBooks: (f.finishedBooks ?? []).map(b => b.id === book.id ? { ...b, highlights: (b.highlights ?? []).filter(h => h.id !== link.id) } : b) }))}
|
||||||
|
>✕</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
<p className="admin-field-help">Highlights that moved here when this series ended. Restore puts one back on the Episodes page (as General) so you can edit it.</p>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
<div className="admin-field">
|
<div className="admin-field">
|
||||||
<label>Download URL <span style={{ fontWeight: 400, opacity: 0.7 }}>(ZIP — Google Drive, Dropbox, etc.)</span></label>
|
<label>Download URL <span style={{ fontWeight: 400, opacity: 0.7 }}>(ZIP — Google Drive, Dropbox, etc.)</span></label>
|
||||||
<input type="url" placeholder="https://drive.google.com/…" value={book.downloadUrl ?? ''} onChange={e => setForm(f => ({ ...f, finishedBooks: (f.finishedBooks ?? []).map(b => b.id === book.id ? { ...b, downloadUrl: e.target.value } : b) }))} />
|
<input type="url" placeholder="https://drive.google.com/…" value={book.downloadUrl ?? ''} onChange={e => setForm(f => ({ ...f, finishedBooks: (f.finishedBooks ?? []).map(b => b.id === book.id ? { ...b, downloadUrl: e.target.value } : b) }))} />
|
||||||
|
|||||||
Reference in new issue
Block a user