fix: saveRescrapeSelection was missing — now actually saves; Members → Contacts throughout
This commit is contained in:
parent
be7308cd88
commit
00c77396e4
|
|
@ -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');
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue