fix(web): order Recently Pressed by press time + cap at 10
Recently Pressed was derived from the request list (ordered by Request.createdAt), so
an album requested long ago but imported just now sorted to the bottom — freshly
pressed albums never appeared near the top ("new albums don't get added"). Order by
press time (job.updatedAt ≈ import time) instead, and show only the 10 most recent.
The "Pressed" stat tile and the "N in library" note still reflect the true total; the
per-row date label now shows when it was pressed, not requested.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+14
-8
@@ -70,8 +70,9 @@ function jobOf(r: Row) {
|
||||
}
|
||||
|
||||
function pressedMark(r: Row): string {
|
||||
if (!r.createdAt) return "Lyra";
|
||||
const d = new Date(r.createdAt);
|
||||
const when = r.job?.updatedAt ?? r.createdAt; // when it was pressed, not when it was requested
|
||||
if (!when) return "Lyra";
|
||||
const d = new Date(when);
|
||||
return `Lyra · ${d.toLocaleDateString("en-GB", { day: "2-digit", month: "short" }).toUpperCase()}`;
|
||||
}
|
||||
|
||||
@@ -204,16 +205,21 @@ export function Queue() {
|
||||
const activeTab: Tab = tab ?? defaultTab;
|
||||
const shown = buckets[activeTab];
|
||||
|
||||
// Dedupe by artist+album — re-requesting/re-downloading the same album leaves several
|
||||
// completed Requests; show each album once (rows arrive newest-first, so keep the first).
|
||||
// "Recently Pressed": imported albums ordered by when they were PRESSED (job.updatedAt ≈ import
|
||||
// time), newest first — an album requested long ago but imported just now is recently pressed
|
||||
// even though its Request is old (rows arrive by request createdAt, which buried fresh imports).
|
||||
// Dedupe by artist+album (re-downloads leave several completed Requests; keep the most recent).
|
||||
const seenPressed = new Set<string>();
|
||||
const pressed = rows.filter((r) => {
|
||||
if (jobOf(r).state !== "imported") return false;
|
||||
const pressedAll = rows
|
||||
.filter((r) => jobOf(r).state === "imported")
|
||||
.sort((a, b) => new Date(jobOf(b).updatedAt ?? 0).getTime() - new Date(jobOf(a).updatedAt ?? 0).getTime())
|
||||
.filter((r) => {
|
||||
const key = `${r.artist} ${r.album}`.toLowerCase();
|
||||
if (seenPressed.has(key)) return false;
|
||||
seenPressed.add(key);
|
||||
return true;
|
||||
});
|
||||
const pressed = pressedAll.slice(0, 10); // show only the 10 most recently pressed
|
||||
|
||||
const now = Date.now();
|
||||
function renderRow(r: Row) {
|
||||
@@ -310,7 +316,7 @@ export function Queue() {
|
||||
<StatTiles
|
||||
items={[
|
||||
{ k: "On the press", v: active.length },
|
||||
{ k: "Pressed", v: pressed.length, accent: true },
|
||||
{ k: "Pressed", v: pressedAll.length, accent: true },
|
||||
{ k: "Wanted", v: wanted },
|
||||
{ k: "Watching", v: watching, unit: "artists" },
|
||||
]}
|
||||
@@ -383,7 +389,7 @@ export function Queue() {
|
||||
|
||||
{pressed.length > 0 ? (
|
||||
<>
|
||||
<SectionHeader title="Recently Pressed" note={`${pressed.length} in library`} />
|
||||
<SectionHeader title="Recently Pressed" note={`last ${pressed.length} · ${pressedAll.length} in library`} />
|
||||
<PressedList
|
||||
items={pressed.map((r) => ({ id: r.id, artist: r.artist, album: r.album, matrix: pressedMark(r), rgMbid: r.rgMbid ?? null }))}
|
||||
/>
|
||||
|
||||
Reference in New Issue
Block a user