feat(web): tv deck sweeps on open when empty
Drop the standalone search button from season and episode rows; the deck is the one control. An empty deck fires a targeted sweep on open and reports progress in place; a deck with results never sweeps on open. re-search inside the deck forces a fresh sweep.
This commit is contained in:
+1
-1
@@ -431,7 +431,7 @@
|
|||||||
<h2 class="releases-title" id="tv-releases-title">—</h2>
|
<h2 class="releases-title" id="tv-releases-title">—</h2>
|
||||||
<span class="releases-year readout dim" id="tv-releases-sub"></span>
|
<span class="releases-year readout dim" id="tv-releases-sub"></span>
|
||||||
</div>
|
</div>
|
||||||
<button type="button" class="control" id="tv-releases-sweep">search indexers</button>
|
<button type="button" class="control" id="tv-releases-sweep">re-search</button>
|
||||||
</header>
|
</header>
|
||||||
<p class="deck-status readout" id="tv-releases-status" role="status" hidden></p>
|
<p class="deck-status readout" id="tv-releases-status" role="status" hidden></p>
|
||||||
<div id="tv-buckets"></div>
|
<div id="tv-buckets"></div>
|
||||||
|
|||||||
+19
-48
@@ -2834,7 +2834,7 @@ function tvReleasesMain(): TvReleasesView {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
async function load() {
|
async function load(sweepIfEmpty = false) {
|
||||||
const current = request;
|
const current = request;
|
||||||
if (!current) {
|
if (!current) {
|
||||||
return;
|
return;
|
||||||
@@ -2853,7 +2853,12 @@ function tvReleasesMain(): TvReleasesView {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!paintBuckets(dom, outcome.releases, actions)) {
|
if (!paintBuckets(dom, outcome.releases, actions)) {
|
||||||
setStatus("no releases indexed yet — search indexers queues a targeted sweep");
|
// issue 167: an empty deck sweeps on open instead of describing a sweep
|
||||||
|
if (sweepIfEmpty) {
|
||||||
|
startSweep(current);
|
||||||
|
} else {
|
||||||
|
setStatus("no releases indexed yet — re-search queues a targeted sweep");
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setStatus(null);
|
setStatus(null);
|
||||||
@@ -2898,11 +2903,8 @@ function tvReleasesMain(): TvReleasesView {
|
|||||||
}, TV_SWEEP_POLL_MS);
|
}, TV_SWEEP_POLL_MS);
|
||||||
}
|
}
|
||||||
|
|
||||||
sweep.addEventListener("click", () => {
|
/** Queue a targeted sweep, then watch for its releases to land (§6.2). */
|
||||||
const current = request;
|
function startSweep(current: TvDeckRequest) {
|
||||||
if (!current) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
sweep.disabled = true;
|
sweep.disabled = true;
|
||||||
void (async () => {
|
void (async () => {
|
||||||
const outcome = await current.target.search();
|
const outcome = await current.target.search();
|
||||||
@@ -2918,6 +2920,14 @@ function tvReleasesMain(): TvReleasesView {
|
|||||||
window.clearTimeout(pollTimer);
|
window.clearTimeout(pollTimer);
|
||||||
watchSweep(current, sequence);
|
watchSweep(current, sequence);
|
||||||
})();
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
sweep.addEventListener("click", () => {
|
||||||
|
const current = request;
|
||||||
|
if (!current) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
startSweep(current);
|
||||||
});
|
});
|
||||||
|
|
||||||
function open(next: TvDeckRequest) {
|
function open(next: TvDeckRequest) {
|
||||||
@@ -2929,7 +2939,7 @@ function tvReleasesMain(): TvReleasesView {
|
|||||||
clearBuckets(dom);
|
clearBuckets(dom);
|
||||||
sweep.disabled = false;
|
sweep.disabled = false;
|
||||||
back.focus();
|
back.focus();
|
||||||
void load();
|
void load(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
function hide() {
|
function hide() {
|
||||||
@@ -3217,27 +3227,6 @@ function seriesMain(board: HTMLElement, tvDeck: TvReleasesView, views: HideableV
|
|||||||
const space = document.createElement("span");
|
const space = document.createElement("span");
|
||||||
space.className = "season-space";
|
space.className = "season-space";
|
||||||
|
|
||||||
const searchBtn = document.createElement("button");
|
|
||||||
searchBtn.type = "button";
|
|
||||||
searchBtn.className = "control";
|
|
||||||
searchBtn.textContent = "search";
|
|
||||||
searchBtn.addEventListener("click", () => {
|
|
||||||
const currentId = seriesId;
|
|
||||||
if (currentId === null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
searchBtn.disabled = true;
|
|
||||||
void (async () => {
|
|
||||||
const outcome = await seasonTarget(currentId, season.number).search();
|
|
||||||
searchBtn.disabled = false;
|
|
||||||
if (outcome.kind === "error") {
|
|
||||||
setStatus(`search failed — ${outcome.detail}`, "fault");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setStatus(`season ${PAD_TWO(season.number)} sweep queued — results land in its deck`);
|
|
||||||
})();
|
|
||||||
});
|
|
||||||
|
|
||||||
const deckBtn = document.createElement("button");
|
const deckBtn = document.createElement("button");
|
||||||
deckBtn.type = "button";
|
deckBtn.type = "button";
|
||||||
deckBtn.className = "control";
|
deckBtn.className = "control";
|
||||||
@@ -3270,7 +3259,7 @@ function seriesMain(board: HTMLElement, tvDeck: TvReleasesView, views: HideableV
|
|||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
line.append(space, searchBtn, deckBtn);
|
line.append(space, deckBtn);
|
||||||
item.append(line);
|
item.append(line);
|
||||||
|
|
||||||
const episodes = document.createElement("ul");
|
const episodes = document.createElement("ul");
|
||||||
@@ -3360,24 +3349,6 @@ function seriesMain(board: HTMLElement, tvDeck: TvReleasesView, views: HideableV
|
|||||||
});
|
});
|
||||||
actions.append(want);
|
actions.append(want);
|
||||||
|
|
||||||
const searchBtn = document.createElement("button");
|
|
||||||
searchBtn.type = "button";
|
|
||||||
searchBtn.className = "control";
|
|
||||||
searchBtn.textContent = "search";
|
|
||||||
searchBtn.addEventListener("click", () => {
|
|
||||||
searchBtn.disabled = true;
|
|
||||||
void (async () => {
|
|
||||||
const outcome = await episodeTarget(episode.id).search();
|
|
||||||
searchBtn.disabled = false;
|
|
||||||
if (outcome.kind === "error") {
|
|
||||||
setStatus(`search failed — ${outcome.detail}`, "fault");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setStatus(`S${PAD_TWO(seasonNumber)}E${PAD_TWO(episode.number)} sweep queued`);
|
|
||||||
})();
|
|
||||||
});
|
|
||||||
actions.append(searchBtn);
|
|
||||||
|
|
||||||
const deckBtn = document.createElement("button");
|
const deckBtn = document.createElement("button");
|
||||||
deckBtn.type = "button";
|
deckBtn.type = "button";
|
||||||
deckBtn.className = "control";
|
deckBtn.className = "control";
|
||||||
|
|||||||
Reference in New Issue
Block a user