mirror of
https://github.com/got-feedBack/feedBack.git
synced 2026-08-14 20:57:12 +00:00
feat(library): Match→Details "use these values" bridge (#779)
Connects the popup's two tabs. A match only improves the underlying canon+art; by design it never silently re-titles the grid. This adds the explicit opt-in path: each Match candidate (search or Identify-by-audio) gets a "Use these values →" action that copies its title/artist/album/year into the Details tab as pending (unsaved) inputs and lands you there for review — pinning the match too so the art/canon follow. You then Save (overlay) or Write to file. Queue- review candidates are unchanged (they still accept/pin on click). Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
5f499a8a3a
commit
6397a959a4
@@ -303,6 +303,7 @@
|
|||||||
'<span class="text-xs text-fb-textDim shrink-0">' + esc(pct) + '</span></span>' +
|
'<span class="text-xs text-fb-textDim shrink-0">' + esc(pct) + '</span></span>' +
|
||||||
'<span class="block text-xs text-fb-textDim truncate">' + esc(meta) + '</span>' +
|
'<span class="block text-xs text-fb-textDim truncate">' + esc(meta) + '</span>' +
|
||||||
diffChips(song, c) +
|
diffChips(song, c) +
|
||||||
|
(_single ? '<span class="block text-xs text-fb-primary pt-1">Use these values →</span>' : '') +
|
||||||
'</button>';
|
'</button>';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -483,7 +484,39 @@
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
song._detailsState = st;
|
song._detailsState = st;
|
||||||
|
// Match→Details bridge: a candidate picked with "Use these values" lands
|
||||||
|
// its fields here as the pending (unsaved) input values, shown pre-filled
|
||||||
|
// for review — the grid never adopts a match silently, so the user still
|
||||||
|
// Saves (or Writes to file).
|
||||||
|
const adopted = song._pendingDetails;
|
||||||
|
if (adopted) {
|
||||||
|
for (const [f] of DETAIL_FIELDS) {
|
||||||
|
if (f in adopted) st[f].value = String(adopted[f] || '');
|
||||||
|
}
|
||||||
|
song._pendingDetails = null;
|
||||||
|
}
|
||||||
paintDetails(body, song);
|
paintDetails(body, song);
|
||||||
|
if (adopted) {
|
||||||
|
const s = body.querySelector('[data-df-status]');
|
||||||
|
if (s) { s.className = 'text-xs leading-relaxed text-fb-textDim'; s.textContent = 'Filled from the match — review, then Save or Write to file.'; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Match→Details bridge: adopt a candidate's display fields into the Details
|
||||||
|
// tab (opt-in — never silent). Pin the match too so the art/canon follow,
|
||||||
|
// then land on Details pre-filled for review.
|
||||||
|
async function useTheseValues(song, cand) {
|
||||||
|
if (!cand) return;
|
||||||
|
song._pendingDetails = {
|
||||||
|
title: String(cand.title || ''), artist: String(cand.artist || ''),
|
||||||
|
album: String(cand.album || ''), year: String(cand.year || ''),
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
await post('/api/enrichment/review/' + enc(song.filename) + '/pick', { candidate: cand });
|
||||||
|
} catch (_) { /* pin is best-effort; the values still populate Details */ }
|
||||||
|
try { window.feedBack?.emit('library:changed', { reason: 'match' }); } catch (_) { }
|
||||||
|
_tab = 'details';
|
||||||
|
renderTabbed();
|
||||||
}
|
}
|
||||||
|
|
||||||
function paintDetails(body, song) {
|
function paintDetails(body, song) {
|
||||||
@@ -705,6 +738,7 @@
|
|||||||
btn.addEventListener('click', async () => {
|
btn.addEventListener('click', async () => {
|
||||||
const cand = cands[Number(btn.getAttribute('data-mr-cand'))];
|
const cand = cands[Number(btn.getAttribute('data-mr-cand'))];
|
||||||
if (!cand) return;
|
if (!cand) return;
|
||||||
|
if (_single) { useTheseValues(song, cand); return; } // popup → adopt into Details
|
||||||
await post('/api/enrichment/review/' + enc(song.filename) + '/pick',
|
await post('/api/enrichment/review/' + enc(song.filename) + '/pick',
|
||||||
{ candidate: cand });
|
{ candidate: cand });
|
||||||
settle(song);
|
settle(song);
|
||||||
@@ -757,6 +791,7 @@
|
|||||||
btn.addEventListener('click', async () => {
|
btn.addEventListener('click', async () => {
|
||||||
const cand = cands[Number(btn.getAttribute('data-mr-cand'))];
|
const cand = cands[Number(btn.getAttribute('data-mr-cand'))];
|
||||||
if (!cand) return;
|
if (!cand) return;
|
||||||
|
if (_single) { useTheseValues(song, cand); return; } // popup → adopt into Details
|
||||||
await post('/api/enrichment/review/' + enc(song.filename) + '/pick',
|
await post('/api/enrichment/review/' + enc(song.filename) + '/pick',
|
||||||
{ candidate: cand });
|
{ candidate: cand });
|
||||||
settle(song);
|
settle(song);
|
||||||
|
|||||||
Reference in New Issue
Block a user