function moveLink(btn, direction) { const row = btn.closest('.link-row'); const list = document.getElementById('links-list'); const rows = Array.from(list.querySelectorAll('.link-row')); const index = rows.indexOf(row); if (direction === -1 && index > 0) { list.insertBefore(row, rows[index - 1]); } else if (direction === 1 && index < rows.length - 1) { list.insertBefore(rows[index + 1], row); } else { return; // Already at boundary } // Send new order to server const linkIds = Array.from(list.querySelectorAll('.link-row')).map(r => r.dataset.id); fetch('/api/links/reorder', { method: 'PUT', headers: { 'Content-Type': 'application/json', ...csrfHeaders() }, body: JSON.stringify({ link_ids: linkIds }) }).catch(function() {}); } function editLink(btn) { var row = btn.closest('.link-row'); row.querySelectorAll('input').forEach(function(i) { i.disabled = false; }); row.querySelector('.link-edit-btn').classList.add('hidden'); row.querySelector('.link-remove-btn').classList.add('hidden'); row.querySelector('.link-save-btn').classList.remove('hidden'); row.querySelector('.link-cancel-btn').classList.remove('hidden'); row.dataset.origTitle = row.querySelector('[name=title]').value; row.dataset.origUrl = row.querySelector('[name=url]').value; } function cancelLink(btn) { var row = btn.closest('.link-row'); row.querySelector('[name=title]').value = row.dataset.origTitle; row.querySelector('[name=url]').value = row.dataset.origUrl; row.querySelectorAll('input').forEach(function(i) { i.disabled = true; }); row.querySelector('.link-edit-btn').classList.remove('hidden'); row.querySelector('.link-remove-btn').classList.remove('hidden'); row.querySelector('.link-save-btn').classList.add('hidden'); row.querySelector('.link-cancel-btn').classList.add('hidden'); } function saveLink(btn) { var row = btn.closest('.link-row'); var id = row.dataset.id; fetch('/api/links/' + id, { method: 'PUT', headers: { 'Content-Type': 'application/json', ...csrfHeaders() }, body: JSON.stringify({ title: row.querySelector('[name=title]').value, url: row.querySelector('[name=url]').value }) }).then(function(res) { if (!res.ok) throw new Error('Failed to save'); cancelLink(btn); }).catch(function() { var saveBtn = row.querySelector('.link-save-btn'); if (saveBtn) saveBtn.textContent = 'Save failed: retry'; }); }