| 1 |
function moveLink(btn, direction) { |
| 2 |
const row = btn.closest('.link-row'); |
| 3 |
const list = document.getElementById('links-list'); |
| 4 |
const rows = Array.from(list.querySelectorAll('.link-row')); |
| 5 |
const index = rows.indexOf(row); |
| 6 |
|
| 7 |
if (direction === -1 && index > 0) { |
| 8 |
list.insertBefore(row, rows[index - 1]); |
| 9 |
} else if (direction === 1 && index < rows.length - 1) { |
| 10 |
list.insertBefore(rows[index + 1], row); |
| 11 |
} else { |
| 12 |
return; |
| 13 |
} |
| 14 |
|
| 15 |
|
| 16 |
const linkIds = Array.from(list.querySelectorAll('.link-row')).map(r => r.dataset.id); |
| 17 |
fetch('/api/links/reorder', { |
| 18 |
method: 'PUT', |
| 19 |
headers: { 'Content-Type': 'application/json', ...csrfHeaders() }, |
| 20 |
body: JSON.stringify({ link_ids: linkIds }) |
| 21 |
}).catch(function() {}); |
| 22 |
} |
| 23 |
|
| 24 |
function editLink(btn) { |
| 25 |
var row = btn.closest('.link-row'); |
| 26 |
row.querySelectorAll('input').forEach(function(i) { i.disabled = false; }); |
| 27 |
row.querySelector('.link-edit-btn').classList.add('hidden'); |
| 28 |
row.querySelector('.link-remove-btn').classList.add('hidden'); |
| 29 |
row.querySelector('.link-save-btn').classList.remove('hidden'); |
| 30 |
row.querySelector('.link-cancel-btn').classList.remove('hidden'); |
| 31 |
row.dataset.origTitle = row.querySelector('[name=title]').value; |
| 32 |
row.dataset.origUrl = row.querySelector('[name=url]').value; |
| 33 |
} |
| 34 |
|
| 35 |
function cancelLink(btn) { |
| 36 |
var row = btn.closest('.link-row'); |
| 37 |
row.querySelector('[name=title]').value = row.dataset.origTitle; |
| 38 |
row.querySelector('[name=url]').value = row.dataset.origUrl; |
| 39 |
row.querySelectorAll('input').forEach(function(i) { i.disabled = true; }); |
| 40 |
row.querySelector('.link-edit-btn').classList.remove('hidden'); |
| 41 |
row.querySelector('.link-remove-btn').classList.remove('hidden'); |
| 42 |
row.querySelector('.link-save-btn').classList.add('hidden'); |
| 43 |
row.querySelector('.link-cancel-btn').classList.add('hidden'); |
| 44 |
} |
| 45 |
|
| 46 |
function saveLink(btn) { |
| 47 |
var row = btn.closest('.link-row'); |
| 48 |
var id = row.dataset.id; |
| 49 |
fetch('/api/links/' + id, { |
| 50 |
method: 'PUT', |
| 51 |
headers: { 'Content-Type': 'application/json', ...csrfHeaders() }, |
| 52 |
body: JSON.stringify({ |
| 53 |
title: row.querySelector('[name=title]').value, |
| 54 |
url: row.querySelector('[name=url]').value |
| 55 |
}) |
| 56 |
}).then(function(res) { |
| 57 |
if (!res.ok) throw new Error('Failed to save'); |
| 58 |
cancelLink(btn); |
| 59 |
}).catch(function() { |
| 60 |
var saveBtn = row.querySelector('.link-save-btn'); |
| 61 |
if (saveBtn) saveBtn.textContent = 'Save failed: retry'; |
| 62 |
}); |
| 63 |
} |
| 64 |
|