Skip to main content

max / makenotwork

2.5 KB · 64 lines History Blame Raw
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; // Already at boundary
13 }
14
15 // Send new order to server
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