From 9a5d187c0d7e4ae7e4836e574a29f454057a970f Mon Sep 17 00:00:00 2001 From: BoulderBadgeDad Date: Tue, 16 Jun 2026 11:55:59 -0700 Subject: [PATCH] Video get-modal: fix owned-season dead-end under 'Missing only' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fully-owned seasons used to render with a disabled checkbox and expand to nothing (every episode hidden by the filter) — looked broken. Now: - Fully-owned seasons are HIDDEN while 'Missing only' is on (the filter doing its job); turn it off to see + re-download them (owned episodes are selectable). Season meta reads 'owned · N eps' when shown. - If you own EVERY episode, a hint appears: 'You have every episode. Turn off Missing only to re-download.' (instead of a blank list). Partial seasons (with gaps) show + expand as before. --- webui/static/video/video-get-modal.js | 12 ++++++++++-- webui/static/video/video-side.css | 5 +++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/webui/static/video/video-get-modal.js b/webui/static/video/video-get-modal.js index d8302ea1..8226c7c9 100644 --- a/webui/static/video/video-get-modal.js +++ b/webui/static/video/video-get-modal.js @@ -236,6 +236,7 @@ if (!d.seasons || !d.seasons.length) { wrap.hidden = true; return; } var today = isoToday(); modalState = { kind: 'show', sel: new Set() }; + var totalMissing = 0; var html = '
Episodes' + '
'; @@ -243,17 +244,24 @@ var eps = s.episodes || []; var missing = 0; eps.forEach(function (e) { if (epState(e, today) === 'missing') { missing++; modalState.sel.add(s.season_number + '_' + e.episode_number); } }); - html += '
' + + totalMissing += missing; + // Fully-owned seasons are hidden while "Missing only" is on (turn it off + // to re-download); otherwise an owned season expanded to nothing. + html += '
' + '
' + '' + '' + esc(s.title || ('Season ' + s.season_number)) + '' + - '' + (missing ? missing + ' missing · ' : '') + eps.length + ' eps' + + '' + (missing ? missing + ' missing · ' : 'owned · ') + eps.length + ' eps' + '' + '
' + '
' + eps.map(function (e) { return epRow(s.season_number, e, today); }).join('') + '
' + '
'; }); html += '
'; + // When you own everything, the missing-only view would be blank — say so. + if (totalMissing === 0) { + html += '
✓ You have every episode. Turn off “Missing only” to re-download.
'; + } wrap.innerHTML = html; wrap.classList.add('vgm-eps--missing-only'); wrap.hidden = false; diff --git a/webui/static/video/video-side.css b/webui/static/video/video-side.css index 4b7c1b73..aadcdae2 100644 --- a/webui/static/video/video-side.css +++ b/webui/static/video/video-side.css @@ -2034,3 +2034,8 @@ body[data-side="video"] #soulsync-toggle { display: none; } .vgm-follow-row input { accent-color: rgb(var(--accent-rgb, 88 101 242)); width: 17px; height: 17px; cursor: pointer; flex-shrink: 0; } .vgm-follow-txt { font-size: 13px; color: rgba(255, 255, 255, 0.82); } .vgm-follow-txt strong { color: #fff; font-weight: 800; } + +/* Fully-owned seasons hide while "Missing only" is on (turn it off to re-download). */ +.vgm-eps--missing-only .vgm-season--owned { display: none; } +.vgm-eps-allowned { display: none; padding: 22px 14px; text-align: center; font-size: 13.5px; font-weight: 600; color: rgba(108, 211, 145, 0.85); } +.vgm-eps--missing-only .vgm-eps-allowned { display: block; }