fix: saveRescrapeSelection was missing — now actually saves; Members → Contacts throughout

This commit is contained in:
James 2026-03-20 01:06:54 -04:00
parent be7308cd88
commit 00c77396e4
1 changed files with 45 additions and 8 deletions

View File

@ -53,7 +53,7 @@
<!-- Tabs --> <!-- Tabs -->
<div class="flex gap-0 px-6 mt-4 border-b shrink-0" style="border-color:var(--ds-bd)"> <div class="flex gap-0 px-6 mt-4 border-b shrink-0" style="border-color:var(--ds-bd)">
<button id="tabDetails" onclick="switchEditTab('details')" class="px-4 py-2 text-sm font-medium border-b-2 border-[#c9a84c] text-white transition -mb-px">Details</button> <button id="tabDetails" onclick="switchEditTab('details')" class="px-4 py-2 text-sm font-medium border-b-2 border-[#c9a84c] text-white transition -mb-px">Details</button>
<button id="tabMembers" onclick="switchEditTab('members')" class="px-4 py-2 text-sm font-medium border-b-2 border-transparent text-[#94a3b8] hover:text-white transition -mb-px">Members <span id="memberCountBadge" class="ml-1 px-1.5 py-0.5 rounded-full text-xs bg-white/[0.08]">0</span></button> <button id="tabMembers" onclick="switchEditTab('members')" class="px-4 py-2 text-sm font-medium border-b-2 border-transparent text-[#94a3b8] hover:text-white transition -mb-px">Contacts <span id="memberCountBadge" class="ml-1 px-1.5 py-0.5 rounded-full text-xs bg-white/[0.08]">0</span></button>
</div> </div>
<!-- Details Tab --> <!-- Details Tab -->
<div id="editTabDetails" class="overflow-y-auto p-6"> <div id="editTabDetails" class="overflow-y-auto p-6">
@ -90,7 +90,7 @@
<div id="editTabMembers" class="hidden overflow-y-auto p-6 flex-1"> <div id="editTabMembers" class="hidden overflow-y-auto p-6 flex-1">
<!-- Rescrape panel --> <!-- Rescrape panel -->
<div class="flex items-center justify-between mb-4"> <div class="flex items-center justify-between mb-4">
<span class="text-sm font-medium text-white">Team members</span> <span class="text-sm font-medium text-white">Contacts</span>
<button id="rescrapeBtn" onclick="startRescrape()" class="flex items-center gap-2 px-3 py-1.5 rounded-lg text-xs font-medium transition" style="background:var(--ds-hv);color:var(--ds-tx2)"> <button id="rescrapeBtn" onclick="startRescrape()" class="flex items-center gap-2 px-3 py-1.5 rounded-lg text-xs font-medium transition" style="background:var(--ds-hv);color:var(--ds-tx2)">
<svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"/></svg> <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"/></svg>
Rescrape website Rescrape website
@ -106,17 +106,17 @@
</div> </div>
<!-- Member list --> <!-- Member list -->
<div id="memberList" class="space-y-2 mb-4"></div> <div id="memberList" class="space-y-2 mb-4"></div>
<div id="noMembers" class="hidden text-sm text-center py-6" style="color:var(--ds-tx3)">No members yet</div> <div id="noContacts" class="hidden text-sm text-center py-6" style="color:var(--ds-tx3)">No contacts yet</div>
<!-- Add manually --> <!-- Add contact manually -->
<div class="pt-3 border-t" style="border-color:var(--ds-bd)"> <div class="pt-3 border-t" style="border-color:var(--ds-bd)">
<p class="text-xs mb-2 font-medium" style="color:var(--ds-tx3)">Add manually</p> <p class="text-xs mb-2 font-medium" style="color:var(--ds-tx3)">Add contact manually</p>
<div class="grid gap-2 mb-2" style="grid-template-columns:1fr 1fr"> <div class="grid gap-2 mb-2" style="grid-template-columns:1fr 1fr">
<input type="text" id="newMemberName" placeholder="Name" class="px-3 py-2 bg-[#0a1628] border border-white/[0.08] rounded-lg text-white text-sm focus:outline-none focus:border-[#c9a84c] placeholder-[#64748b]"> <input type="text" id="newMemberName" placeholder="Name" class="px-3 py-2 bg-[#0a1628] border border-white/[0.08] rounded-lg text-white text-sm focus:outline-none focus:border-[#c9a84c] placeholder-[#64748b]">
<input type="text" id="newMemberTitle" placeholder="Title" class="px-3 py-2 bg-[#0a1628] border border-white/[0.08] rounded-lg text-white text-sm focus:outline-none focus:border-[#c9a84c] placeholder-[#64748b]"> <input type="text" id="newMemberTitle" placeholder="Title" class="px-3 py-2 bg-[#0a1628] border border-white/[0.08] rounded-lg text-white text-sm focus:outline-none focus:border-[#c9a84c] placeholder-[#64748b]">
<input type="email" id="newMemberEmail" placeholder="Email" class="px-3 py-2 bg-[#0a1628] border border-white/[0.08] rounded-lg text-white text-sm focus:outline-none focus:border-[#c9a84c] placeholder-[#64748b]"> <input type="email" id="newMemberEmail" placeholder="Email" class="px-3 py-2 bg-[#0a1628] border border-white/[0.08] rounded-lg text-white text-sm focus:outline-none focus:border-[#c9a84c] placeholder-[#64748b]">
<input type="tel" id="newMemberPhoneBiz" placeholder="Business phone" class="px-3 py-2 bg-[#0a1628] border border-white/[0.08] rounded-lg text-white text-sm focus:outline-none focus:border-[#c9a84c] placeholder-[#64748b]"> <input type="tel" id="newMemberPhoneBiz" placeholder="Business phone" class="px-3 py-2 bg-[#0a1628] border border-white/[0.08] rounded-lg text-white text-sm focus:outline-none focus:border-[#c9a84c] placeholder-[#64748b]">
<input type="tel" id="newMemberPhonePersonal" placeholder="Personal phone" onkeydown="if(event.key==='Enter'){event.preventDefault();addGlobalMember();}" class="px-3 py-2 bg-[#0a1628] border border-white/[0.08] rounded-lg text-white text-sm focus:outline-none focus:border-[#c9a84c] placeholder-[#64748b]"> <input type="tel" id="newMemberPhonePersonal" placeholder="Personal phone" onkeydown="if(event.key==='Enter'){event.preventDefault();addGlobalMember();}" class="px-3 py-2 bg-[#0a1628] border border-white/[0.08] rounded-lg text-white text-sm focus:outline-none focus:border-[#c9a84c] placeholder-[#64748b]">
<button onclick="addGlobalMember()" class="px-3 py-2 bg-[#c9a84c] hover:bg-[#b8973f] text-[#0a1628] font-bold rounded-lg text-sm transition">+ Add person</button> <button onclick="addGlobalMember()" class="px-3 py-2 bg-[#c9a84c] hover:bg-[#b8973f] text-[#0a1628] font-bold rounded-lg text-sm transition">+ Add contact</button>
</div> </div>
<div id="addMemberError" class="hidden mt-2 text-xs text-red-400"></div> <div id="addMemberError" class="hidden mt-2 text-xs text-red-400"></div>
</div> </div>
@ -317,7 +317,7 @@
// ---- Members Tab ---- // ---- Members Tab ----
function renderMemberList() { function renderMemberList() {
const list = document.getElementById('memberList'); const list = document.getElementById('memberList');
const none = document.getElementById('noMembers'); const none = document.getElementById('noContacts');
document.getElementById('memberCountBadge').textContent = editingMembers.length; document.getElementById('memberCountBadge').textContent = editingMembers.length;
if (editingMembers.length === 0) { list.innerHTML = ''; none.classList.remove('hidden'); return; } if (editingMembers.length === 0) { list.innerHTML = ''; none.classList.remove('hidden'); return; }
none.classList.add('hidden'); none.classList.add('hidden');
@ -346,7 +346,7 @@
+ '<div><label class="text-xs mb-1 block" style="color:var(--ds-tx3)">Business phone</label><input type="tel" value="' + escHtml(m.phone_business||m.phone||'') + '" oninput="updateMember(' + i + ',\"phone_business\",this.value)" class="w-full px-2 py-1.5 bg-[#0a1628] border border-white/[0.08] rounded text-white text-sm focus:outline-none focus:border-[#c9a84c]"></div>' + '<div><label class="text-xs mb-1 block" style="color:var(--ds-tx3)">Business phone</label><input type="tel" value="' + escHtml(m.phone_business||m.phone||'') + '" oninput="updateMember(' + i + ',\"phone_business\",this.value)" class="w-full px-2 py-1.5 bg-[#0a1628] border border-white/[0.08] rounded text-white text-sm focus:outline-none focus:border-[#c9a84c]"></div>'
+ '<div><label class="text-xs mb-1 block" style="color:var(--ds-tx3)">Personal phone</label><input type="tel" value="' + escHtml(m.phone_personal||'') + '" oninput="updateMember(' + i + ',\"phone_personal\",this.value)" class="w-full px-2 py-1.5 bg-[#0a1628] border border-white/[0.08] rounded text-white text-sm focus:outline-none focus:border-[#c9a84c]"></div>' + '<div><label class="text-xs mb-1 block" style="color:var(--ds-tx3)">Personal phone</label><input type="tel" value="' + escHtml(m.phone_personal||'') + '" oninput="updateMember(' + i + ',\"phone_personal\",this.value)" class="w-full px-2 py-1.5 bg-[#0a1628] border border-white/[0.08] rounded text-white text-sm focus:outline-none focus:border-[#c9a84c]"></div>'
+ '</div>' + '</div>'
+ '<button onclick="removeGlobalMember(' + i + ')" class="px-2 py-1 rounded text-xs transition hover:opacity-80" style="background:rgba(239,68,68,0.1);color:#ef4444;border:1px solid rgba(239,68,68,0.2)">Remove person</button>' + '<button onclick="removeGlobalMember(' + i + ')" class="px-2 py-1 rounded text-xs transition hover:opacity-80" style="background:rgba(239,68,68,0.1);color:#ef4444;border:1px solid rgba(239,68,68,0.2)">Remove contact</button>'
+ '</div>' + '</div>'
+ '</div>'; + '</div>';
}).join(''); }).join('');
@ -528,6 +528,43 @@
window._rescrapeNewPeople[i][field] = value; window._rescrapeNewPeople[i][field] = value;
} }
} }
async function saveRescrapeSelection() {
const people = window._rescrapeNewPeople || [];
const checked = document.querySelectorAll('.rescrape-cb:checked');
const toAdd = [];
checked.forEach(cb => {
const p = people[parseInt(cb.dataset.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 (toAdd.length === 0) { document.getElementById('rescrapeResults').classList.add('hidden'); return; }
toAdd.forEach(m => editingMembers.push(m));
renderMemberList();
document.getElementById('rescrapeResults').classList.add('hidden');
const btn = document.getElementById('saveOrgBtn');
const errEl = document.getElementById('editModalError');
btn.disabled = true; btn.textContent = 'Saving...';
try {
const version = parseInt(document.getElementById('eVersion').value) || 1;
const mRes = await fetchAPI('/api/orgs/' + editingOrgId + '/members', {
method: 'PUT',
body: JSON.stringify({ members: editingMembers, version })
});
const mData = await mRes.json();
if (!mRes.ok) throw new Error(mData.error || 'Failed to save');
document.getElementById('eVersion').value = mData.version || version + 1;
btn.disabled = false; btn.textContent = 'Save Changes';
if (window._orgsMap && window._orgsMap[editingOrgId]) {
window._orgsMap[editingOrgId].members = editingMembers;
window._orgsMap[editingOrgId].version = mData.version || version + 1;
}
} catch(e) {
editingMembers.splice(editingMembers.length - toAdd.length, toAdd.length);
renderMemberList();
errEl.textContent = e.message; errEl.classList.remove('hidden');
btn.disabled = false; btn.textContent = 'Save Changes';
}
}
function addRescrapeSelected() { function addRescrapeSelected() {
const people = window._rescrapeNewPeople || []; const people = window._rescrapeNewPeople || [];
const checked = document.querySelectorAll('.rescrape-cb:checked'); const checked = document.querySelectorAll('.rescrape-cb:checked');