Fix reference links
This commit is contained in:
parent
5812d3cc76
commit
13042bcfa3
2 changed files with 46 additions and 10 deletions
55
app.js
55
app.js
|
|
@ -14,8 +14,9 @@ let sortCol = 'name';
|
||||||
let sortDir = 'asc';
|
let sortDir = 'asc';
|
||||||
|
|
||||||
// editing state
|
// editing state
|
||||||
let editingTuneId = null; // null = add mode
|
let editingTuneId = null; // null = add mode
|
||||||
let editingEntryId = null; // null = no existing instrument entry
|
let editingEntryId = null; // null = no existing instrument entry
|
||||||
|
let editingOriginalRefIds = []; // ref IDs present when edit modal opened
|
||||||
|
|
||||||
// notes modal state
|
// notes modal state
|
||||||
let notesTuneId = null;
|
let notesTuneId = null;
|
||||||
|
|
@ -499,8 +500,9 @@ function pillStatus(status, extraClass = '') {
|
||||||
btnAddTune.addEventListener('click', openAdd);
|
btnAddTune.addEventListener('click', openAdd);
|
||||||
|
|
||||||
function openAdd() {
|
function openAdd() {
|
||||||
editingTuneId = null;
|
editingTuneId = null;
|
||||||
editingEntryId = null;
|
editingEntryId = null;
|
||||||
|
editingOriginalRefIds = [];
|
||||||
$('modal-title').textContent = 'Add tune';
|
$('modal-title').textContent = 'Add tune';
|
||||||
tuneForm.reset();
|
tuneForm.reset();
|
||||||
refsList.innerHTML = '';
|
refsList.innerHTML = '';
|
||||||
|
|
@ -552,6 +554,7 @@ async function openEdit(tuneId, entryId) {
|
||||||
tuneForm.elements.inst_difficulty.value = entry.difficulty ?? '';
|
tuneForm.elements.inst_difficulty.value = entry.difficulty ?? '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
editingOriginalRefIds = (fullTune.references ?? []).map(r => r.id);
|
||||||
(fullTune.references ?? []).forEach(r => addRefRow(r.link, r.site?.name ?? '', r.id, r.site_id, r.musicians ?? []));
|
(fullTune.references ?? []).forEach(r => addRefRow(r.link, r.site?.name ?? '', r.id, r.site_id, r.musicians ?? []));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -716,6 +719,35 @@ async function saveTune() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sync references
|
||||||
|
const formRows = [...refsList.querySelectorAll('.ref-row')];
|
||||||
|
const formRefIds = new Set(formRows.map(r => r.dataset.refId).filter(Boolean));
|
||||||
|
|
||||||
|
// Delete refs removed from the form
|
||||||
|
for (const refId of editingOriginalRefIds) {
|
||||||
|
if (!formRefIds.has(String(refId))) {
|
||||||
|
await apiFetch(`/tunes/${tuneId}/references/${refId}`, { method: 'DELETE' });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create new refs; patch existing ones (link + site)
|
||||||
|
for (const row of formRows) {
|
||||||
|
const refId = row.dataset.refId;
|
||||||
|
const link = row.querySelector('.ref-link').value.trim() || null;
|
||||||
|
const siteId = row.querySelector('.ref-site').value ? parseInt(row.querySelector('.ref-site').value) : null;
|
||||||
|
if (!link && !siteId) continue;
|
||||||
|
if (refId) {
|
||||||
|
await apiFetch(`/tunes/${tuneId}/references/${refId}`, {
|
||||||
|
method: 'PATCH', body: JSON.stringify({ link, site_id: siteId }),
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const musicians = row._getMusicians ? row._getMusicians() : [];
|
||||||
|
await apiFetch(`/tunes/${tuneId}/references`, {
|
||||||
|
method: 'POST', body: JSON.stringify({ link, site_id: siteId, musicians }),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tuneModal.close();
|
tuneModal.close();
|
||||||
|
|
@ -901,12 +933,17 @@ async function openRefsModal(tuneId) {
|
||||||
refs.forEach(r => {
|
refs.forEach(r => {
|
||||||
const item = document.createElement('div');
|
const item = document.createElement('div');
|
||||||
item.className = 'refs-modal-item';
|
item.className = 'refs-modal-item';
|
||||||
const musicians = r.musicians?.map(m => m.name).join(', ') ?? '';
|
const musicians = r.musicians?.map(m => m.name).join(', ') ?? '';
|
||||||
const siteName = r.site?.name ?? '';
|
const siteName = r.site?.name ?? '';
|
||||||
const meta = [siteName, musicians].filter(Boolean).join(' · ');
|
const meta = [siteName, musicians].filter(Boolean).join(' · ');
|
||||||
|
// Use meta as link text; fall back to hostname so raw URL is never shown
|
||||||
|
let displayText = meta;
|
||||||
|
if (!displayText && r.link) {
|
||||||
|
try { displayText = new URL(r.link).hostname.replace(/^www\./, ''); } catch { displayText = 'link'; }
|
||||||
|
}
|
||||||
|
if (!displayText) displayText = 'link';
|
||||||
item.innerHTML = `
|
item.innerHTML = `
|
||||||
<a href="${esc(r.link ?? '')}" target="_blank" rel="noopener" class="ref-link-anchor">${esc(r.link ?? r.site?.name ?? 'link')}</a>
|
<a href="${esc(r.link ?? '')}" target="_blank" rel="noopener" class="ref-link-anchor">${esc(displayText)}</a>`;
|
||||||
${meta ? `<span class="ref-meta">${esc(meta)}</span>` : ''}`;
|
|
||||||
refsModalList.appendChild(item);
|
refsModalList.appendChild(item);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -787,7 +787,6 @@ fieldset.active .fs-body { display: contents; }
|
||||||
.ref-link-anchor {
|
.ref-link-anchor {
|
||||||
color: var(--accent);
|
color: var(--accent);
|
||||||
font-size: .875rem;
|
font-size: .875rem;
|
||||||
word-break: break-all;
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
.ref-link-anchor:hover { text-decoration: underline; }
|
.ref-link-anchor:hover { text-decoration: underline; }
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue