function showContactDetails(contactId) { openContactDetailsModal(contactId); } // ── OPEN CONTACT DETAILS MODAL/DRAWER ── function openContactDetailsModal(contactId, isEditMode = false) { const c = mockContacts.find(x => x.id === contactId); if (!c) { alert("Contact not found."); return; } let backdrop = document.getElementById('contact-details-backdrop'); if (!backdrop) { backdrop = document.createElement('div'); backdrop.id = 'contact-details-backdrop'; backdrop.className = 'sidepanel-backdrop'; document.body.appendChild(backdrop); } let sidepanel = document.getElementById('contact-details-drawer'); if (!sidepanel) { sidepanel = document.createElement('div'); sidepanel.id = 'contact-details-drawer'; sidepanel.className = 'sidepanel'; document.body.appendChild(sidepanel); } if (isEditMode) { const companyOptions = mockCompanies.map(comp => ``).join(''); sidepanel.innerHTML = `

Edit Contact

`; } else { sidepanel.innerHTML = `

Contact Profile

${escapeHtml(c.first_name[0] || '')}${escapeHtml(c.last_name[0] || '')}

${escapeHtml(c.first_name)} ${escapeHtml(c.last_name)}

${escapeHtml(c.title || 'No Title')}

Professional Identity
Associated Company ${escapeHtml(c.company || 'No Company')}
Role / Title ${escapeHtml(c.title) || 'No Data'}
Contact Role Status ${c.is_primary ? `Primary Contact` : `Standard Contact`}
Contact Details
Email ${c.email ? `${escapeHtml(c.email)}` : 'No Data'}
Phone ${escapeHtml(c.phone) || 'No Data'}
LinkedIn ${c.linkedin ? `${escapeHtml(c.linkedin)}` : 'No Data'}
`; } const closeBtn = document.getElementById('contact-details-close-btn'); const closeDrawer = () => { sidepanel.classList.remove('show'); backdrop.classList.remove('show'); }; if (closeBtn) { closeBtn.addEventListener('click', closeDrawer); } backdrop.onclick = closeDrawer; if (isEditMode) { const cancelBtn = document.getElementById('contact-edit-cancel-btn'); const form = document.getElementById('contact-edit-form'); if (cancelBtn) { cancelBtn.addEventListener('click', () => { openContactDetailsModal(contactId, false); }); } if (form) { form.addEventListener('submit', async (e) => { e.preventDefault(); const formData = new FormData(form); const payload = {}; formData.forEach((val, key) => { payload[key] = val; }); payload.company_id = parseInt(payload.company_id, 10); payload.is_primary = document.getElementById('contact-edit-is-primary').checked ? 1 : 0; try { const response = await fetch(`/api/contacts/${contactId}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); const result = await response.json(); if (response.ok && result.success) { closeDrawer(); await loadDataFromDb(); handleNavigation(); } else { alert("Error: " + (result.error || "Could not save contact.")); } } catch (err) { console.error("Error updating contact:", err); alert("Error sending update request to backend."); } }); } } else { const editBtn = document.getElementById('contact-details-edit-btn'); const okBtn = document.getElementById('contact-details-ok-btn'); if (editBtn) { editBtn.addEventListener('click', () => { openContactDetailsModal(contactId, true); }); } if (okBtn) { okBtn.addEventListener('click', closeDrawer); } } setTimeout(() => { sidepanel.classList.add('show'); backdrop.classList.add('show'); }, 10); } // ── OPEN AGENT SPACE DRAWER/SIDEPANEL ──