Inbox/queue: clickable feed titles and episode titles
All checks were successful
Build and push Docker image / build (push) Successful in 12s
Test / test (push) Successful in 14s

- Feed title in inbox and queue is now a link that opens the feed's episode list
- Episode title in inbox is now clickable and opens the show notes sidebar
- Backend: include description in inbox API response so sidebar has content

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Marwin Schulz 2026-03-20 09:12:36 +01:00
parent afcbe087bb
commit f049c6ae66
3 changed files with 7 additions and 4 deletions

View file

@ -629,7 +629,7 @@ def inbox(request):
.select_related('feed') .select_related('feed')
.order_by('-pub_date') .order_by('-pub_date')
.values( .values(
'id', 'title', 'audio_url', 'duration_seconds', 'id', 'title', 'description', 'audio_url', 'duration_seconds',
'pub_date', 'artwork_url', 'pub_date', 'artwork_url',
'feed__id', 'feed__title', 'feed__artwork_url', 'feed__id', 'feed__title', 'feed__artwork_url',
)[offset:offset + limit] )[offset:offset + limit]

View file

@ -1379,6 +1379,8 @@ body.dnd-mode .timer-display {
color: var(--text-muted, #888); margin-top: 2px; flex-wrap: wrap; color: var(--text-muted, #888); margin-top: 2px; flex-wrap: wrap;
} }
.episode-date { font-weight: 500; color: var(--fg, #ccc); } .episode-date { font-weight: 500; color: var(--fg, #ccc); }
.episode-feed-link { cursor: pointer; }
.episode-feed-link:hover { text-decoration: underline; color: var(--accent, #e63946); }
.episode-dur { color: var(--text-muted, #888); } .episode-dur { color: var(--text-muted, #888); }
/* Episode progress bar */ /* Episode progress bar */

View file

@ -1591,6 +1591,7 @@ async function loadAndRenderInbox(append = false) {
podcastEpCache[ep.id] = { podcastEpCache[ep.id] = {
id: ep.id, id: ep.id,
title: ep.title, title: ep.title,
description: ep.description || '',
audioUrl: ep.audio_url, audioUrl: ep.audio_url,
durationSeconds: ep.duration_seconds, durationSeconds: ep.duration_seconds,
positionSeconds: ep.position_seconds || 0, positionSeconds: ep.position_seconds || 0,
@ -1613,9 +1614,9 @@ async function loadAndRenderInbox(append = false) {
</label> </label>
${ep['feed__artwork_url'] ? `<img class="podcast-thumb" src="${escapeHtml(ep['feed__artwork_url'])}" alt="">` : '<div class="podcast-thumb-placeholder"></div>'} ${ep['feed__artwork_url'] ? `<img class="podcast-thumb" src="${escapeHtml(ep['feed__artwork_url'])}" alt="">` : '<div class="podcast-thumb-placeholder"></div>'}
<div class="episode-info"> <div class="episode-info">
<div class="episode-title">${escapeHtml(ep.title)}</div> <div class="episode-title ep-clickable" onclick="openEpisodeSidebar(${ep.id})" title="Show notes">${escapeHtml(ep.title)}</div>
<div class="episode-meta"> <div class="episode-meta">
<span class="episode-date">${escapeHtml(ep['feed__title'])}</span> <span class="episode-date episode-feed-link" onclick="openFeed(${ep['feed__id']})" title="Open feed">${escapeHtml(ep['feed__title'])}</span>
${dateStr ? `<span class="episode-dur">${escapeHtml(dateStr)}</span>` : ''} ${dateStr ? `<span class="episode-dur">${escapeHtml(dateStr)}</span>` : ''}
${dur !== '0:00' ? `<span class="episode-dur">${escapeHtml(dur)}</span>` : ''} ${dur !== '0:00' ? `<span class="episode-dur">${escapeHtml(dur)}</span>` : ''}
</div> </div>
@ -1813,7 +1814,7 @@ async function loadAndRenderQueue() {
<div class="episode-info"> <div class="episode-info">
<div class="episode-title">${escapeHtml(item['episode__title'])}</div> <div class="episode-title">${escapeHtml(item['episode__title'])}</div>
<div class="episode-meta"> <div class="episode-meta">
<span class="episode-date">${escapeHtml(item['episode__feed__title'])}</span> <span class="episode-date episode-feed-link" onclick="openFeed(${item['episode__feed__id']})" title="Open feed">${escapeHtml(item['episode__feed__title'])}</span>
${dur !== '0:00' ? `<span class="episode-dur">${escapeHtml(dur)}</span>` : ''} ${dur !== '0:00' ? `<span class="episode-dur">${escapeHtml(dur)}</span>` : ''}
</div> </div>
${progressPct > 0 ? `<div class="episode-progress-bar"><div class="episode-progress-fill" style="width:${progressPct.toFixed(1)}%"></div></div>` : ''} ${progressPct > 0 ? `<div class="episode-progress-bar"><div class="episode-progress-fill" style="width:${progressPct.toFixed(1)}%"></div></div>` : ''}