diff --git a/frontend/src/melodies/MelodyList.jsx b/frontend/src/melodies/MelodyList.jsx index 07520ad..9c0c0f4 100644 --- a/frontend/src/melodies/MelodyList.jsx +++ b/frontend/src/melodies/MelodyList.jsx @@ -243,6 +243,7 @@ function buildOfflineCppCode(rows) { export default function MelodyList() { const [melodies, setMelodies] = useState([]); const [total, setTotal] = useState(0); + const [allMelodyCount, setAllMelodyCount] = useState(0); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); const [search, setSearch] = useState(""); @@ -317,9 +318,13 @@ export default function MelodyList() { if (toneFilter) params.set("tone", toneFilter); if (statusFilter) params.set("status", statusFilter); const qs = params.toString(); - const data = await api.get(`/melodies${qs ? `?${qs}` : ""}`); + const [data, allData] = await Promise.all([ + api.get(`/melodies${qs ? `?${qs}` : ""}`), + api.get("/melodies"), + ]); setMelodies(data.melodies || []); setTotal(data.total || 0); + setAllMelodyCount(allData.total || (allData.melodies || []).length || 0); } catch (err) { setError(err.message); } finally { @@ -371,18 +376,20 @@ export default function MelodyList() { : null; const source = built?.binary_url ? "Archetype" : (url ? "Melody URL" : null); const filename = (() => { - if (!url) return null; - try { - const parsed = new URL(url, window.location.origin); - const path = decodeURIComponent(parsed.pathname || ""); - const parts = path.split("/"); - const name = parts[parts.length - 1]; - if (name) return name; - } catch { - // fallback below - } if (built?.pid) return `${built.pid}.bsm`; - return row?.pid ? `${row.pid}.bsm` : "melody.bsm"; + if (row?.pid) return `${row.pid}.bsm`; + if (url) { + try { + const parsed = new URL(url, window.location.origin); + const path = decodeURIComponent(parsed.pathname || ""); + const parts = path.split("/"); + const name = parts[parts.length - 1]; + if (name && name.toLowerCase().endsWith(".bsm")) return name; + } catch { + // fallback below + } + } + return "melody.bsm"; })(); return { url, filename, source, built }; }; @@ -951,8 +958,9 @@ export default function MelodyList() { const selectClass = "px-3 py-2 rounded-md text-sm cursor-pointer border"; return ( -