fix: track scrape selections in JS Set instead of querying DOM checked state
This commit is contained in:
parent
00c77396e4
commit
dc30969119
|
|
@ -435,7 +435,7 @@
|
||||||
html += '<div class="rounded-lg overflow-hidden" style="background:var(--ds-sf);border:1px solid var(--ds-bd)">'
|
html += '<div class="rounded-lg overflow-hidden" style="background:var(--ds-sf);border:1px solid var(--ds-bd)">'
|
||||||
// checkbox + name row
|
// checkbox + name row
|
||||||
+ '<div class="flex items-center gap-3 px-3 py-2 cursor-pointer" onclick="toggleScrapeExpand(' + i + ')">'
|
+ '<div class="flex items-center gap-3 px-3 py-2 cursor-pointer" onclick="toggleScrapeExpand(' + i + ')">'
|
||||||
+ '<input type="checkbox" class="rescrape-cb accent-[#c9a84c] shrink-0" data-idx="' + i + '" onchange="syncRescrapeSelectAll();event.stopPropagation();" onclick="event.stopPropagation()">'
|
+ '<input type="checkbox" class="rescrape-cb accent-[#c9a84c] shrink-0" data-idx="' + i + '" onchange="toggleScrapeSelect(' + i + ',this.checked);syncRescrapeSelectAll();event.stopPropagation();" onclick="event.stopPropagation()">'
|
||||||
+ '<div class="flex-1 min-w-0">'
|
+ '<div class="flex-1 min-w-0">'
|
||||||
+ '<div class="text-sm text-white truncate">' + escHtml(p.name || p.email || '—') + '</div>'
|
+ '<div class="text-sm text-white truncate">' + escHtml(p.name || p.email || '—') + '</div>'
|
||||||
+ '<div class="text-xs truncate" style="color:var(--ds-tx3)">' + [p.title, p.email].filter(Boolean).map(v => escHtml(v)).join(' · ') + '</div>'
|
+ '<div class="text-xs truncate" style="color:var(--ds-tx3)">' + [p.title, p.email].filter(Boolean).map(v => escHtml(v)).join(' · ') + '</div>'
|
||||||
|
|
@ -482,10 +482,22 @@
|
||||||
document.getElementById('rescrapeResults').classList.remove('hidden');
|
document.getElementById('rescrapeResults').classList.remove('hidden');
|
||||||
// Store new people for the add button
|
// Store new people for the add button
|
||||||
window._rescrapeNewPeople = newPeople;
|
window._rescrapeNewPeople = newPeople;
|
||||||
|
window._scrapeSelected = new Set();
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggleAllRescrape(checked) {
|
function toggleAllRescrape(checked) {
|
||||||
document.querySelectorAll('.rescrape-cb').forEach(cb => cb.checked = checked);
|
if (!window._scrapeSelected) window._scrapeSelected = new Set();
|
||||||
|
document.querySelectorAll('.rescrape-cb').forEach(cb => {
|
||||||
|
cb.checked = checked;
|
||||||
|
const idx = parseInt(cb.dataset.idx);
|
||||||
|
if (checked) window._scrapeSelected.add(idx);
|
||||||
|
else window._scrapeSelected.delete(idx);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function toggleScrapeSelect(idx, checked) {
|
||||||
|
if (!window._scrapeSelected) window._scrapeSelected = new Set();
|
||||||
|
if (checked) window._scrapeSelected.add(idx);
|
||||||
|
else window._scrapeSelected.delete(idx);
|
||||||
}
|
}
|
||||||
function syncRescrapeSelectAll() {
|
function syncRescrapeSelectAll() {
|
||||||
const all = document.querySelectorAll('.rescrape-cb');
|
const all = document.querySelectorAll('.rescrape-cb');
|
||||||
|
|
@ -530,10 +542,10 @@
|
||||||
}
|
}
|
||||||
async function saveRescrapeSelection() {
|
async function saveRescrapeSelection() {
|
||||||
const people = window._rescrapeNewPeople || [];
|
const people = window._rescrapeNewPeople || [];
|
||||||
const checked = document.querySelectorAll('.rescrape-cb:checked');
|
const selected = window._scrapeSelected || new Set();
|
||||||
const toAdd = [];
|
const toAdd = [];
|
||||||
checked.forEach(cb => {
|
selected.forEach(idx => {
|
||||||
const p = people[parseInt(cb.dataset.idx)];
|
const p = people[idx];
|
||||||
if (p) toAdd.push({ name: p.name || '', email: p.email || '', title: p.title || '', phone_business: p.phone_business || p.phone || '', phone_personal: p.phone_personal || '', photo: p.photo || '', bio: p.bio || '', linkedin: p.linkedin || '' });
|
if (p) toAdd.push({ name: p.name || '', email: p.email || '', title: p.title || '', phone_business: p.phone_business || p.phone || '', phone_personal: p.phone_personal || '', photo: p.photo || '', bio: p.bio || '', linkedin: p.linkedin || '' });
|
||||||
});
|
});
|
||||||
if (toAdd.length === 0) { document.getElementById('rescrapeResults').classList.add('hidden'); return; }
|
if (toAdd.length === 0) { document.getElementById('rescrapeResults').classList.add('hidden'); return; }
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue